JAVA并發(fā)編程有界緩存的實現(xiàn)詳解
更新時間:2016年12月03日 16:04:47 投稿:lqh
這篇文章主要介紹了JAVA并發(fā)編程有界緩存的實現(xiàn)詳解的相關資料,這里舉例說明如何實現(xiàn),四種方法一一代碼實現(xiàn),需要的朋友可以參考下
JAVA并發(fā)編程有界緩存的實現(xiàn)
1、有界緩存的基類
package cn.xf.cp.ch14;
/**
*
*功能:有界緩存實現(xiàn)基類
*時間:下午2:20:00
*文件:BaseBoundedBuffer.java
*@author Administrator
*
* @param <V>
*/
public class BaseBoundedBuffer<V>
{
private final V[] buf;
private int tail;
private int head;
private int count;
public BaseBoundedBuffer(int capacity)
{
//初始化數(shù)組
this.buf = (V[]) new Object[capacity];
}
//放入一個數(shù)據(jù),final方法無法被重寫
protected synchronized final void doPut(V v)
{
buf[tail] = v;
if(++tail == buf.length)
{
tail = 0;
}
//插入一個方法,總量++
++count;
}
/**
* 取出一個數(shù)據(jù)
* @return
*/
protected synchronized final V doTake()
{
V v = buf[head];
buf[head] = null;
if(++head == buf.length)
{
head = 0;
}
--count;
return v;
}
//通過對count的判斷,來確定數(shù)組是否是滿的
public synchronized final boolean isFull()
{
return count == buf.length;
}
public synchronized final boolean isEmpty()
{
return count == 0;
}
}
2、判定前提條件再執(zhí)行操作
package cn.xf.cp.ch14;
/**
*
*功能:對插入和獲取元素操作進行先行檢查,然后執(zhí)行操作,校驗不通過不予操作
*時間:下午2:33:41
*文件:GrumpyBoundedBuffer.java
*@author Administrator
*
* @param <V>
*/
public class GrumpyBoundedBuffer<V> extends BaseBoundedBuffer<V>
{
public GrumpyBoundedBuffer(int size)
{
super(size);
}
public synchronized void put(V v) throws Exception
{
//如果是滿的隊列,就無法插入新的元素
if(this.isFull())
{
throw new Exception("隊列超出");
}
this.doPut(v);
}
//同理,隊列為空的就無法取出新的元素
public synchronized V take() throws Exception
{
if(this.isEmpty())
{
throw new Exception("隊列中無元素");
}
return this.doTake();
}
}
3、通過輪詢與休眠來實現(xiàn)簡單的阻塞
package cn.xf.cp.ch14;
/**
*
*功能:通過輪詢與休眠來實現(xiàn)簡單的阻塞
*時間:下午2:55:54
*文件:SleepyBoundedBuffer.java
*@author Administrator
*
* @param <V>
*/
public class SleepyBoundedBuffer<V> extends BaseBoundedBuffer<V>
{
//2s
private static final long SLEEP_GRANULARITY = 2000;
public SleepyBoundedBuffer(int capacity)
{
super(capacity);
}
//放入隊列的時候
public void put(V v) throws InterruptedException
{
while(true)
{
//這里不對循環(huán)上鎖,不然這個鎖就無法釋放了,不對休眠上鎖,休眠上鎖,在休眠的時候別人也無法操作,永遠都不可能有元素出去
synchronized (this)
{
//如果隊列不是滿的,那么就放入元素
if(!this.isFull())
{
this.doPut(v);
return;
}
}
//否則休眠,退出cpu占用
Thread.sleep(SLEEP_GRANULARITY);
}
}
public V take() throws InterruptedException
{
while(true)
{
//這里不對循環(huán)上鎖,不然這個鎖就無法釋放了,不對休眠上鎖,休眠上鎖,在休眠的時候別人也無法操作,永遠都不可能有新的元素進來
synchronized(this)
{
//如果數(shù)組部位空,那么就可以取出數(shù)據(jù)
if(!this.isEmpty())
{
return this.doTake();
}
//如果隊列為空,休眠幾秒再試
}
Thread.sleep(SLEEP_GRANULARITY);
}
}
}
4、條件隊列
package cn.xf.cp.ch14;
/**
*
*功能:使用條件隊列
*時間:下午3:32:04
*文件:BoundedBuffer.java
*@author Administrator
*
* @param <V>
*/
public class BoundedBuffer<V> extends BaseBoundedBuffer<V>
{
public BoundedBuffer(int capacity)
{
super(capacity);
}
/**
* 放入數(shù)據(jù)元素
* @param v
* @throws InterruptedException
*/
public synchronized void put(V v) throws InterruptedException
{
while(this.isFull())
{
//這里掛起程序,會釋放鎖
this.wait();
}
//如果隊列不為滿的,那么程序被喚醒之后從新獲取鎖
this.doPut(v);
//執(zhí)行結束,喚醒其他隊列
this.notifyAll();
}
public synchronized V take() throws InterruptedException
{
while(this.isEmpty())
{
this.wait();
}
V v = this.doTake();
this.notifyAll();
return v;
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
您可能感興趣的文章:
- Java 并發(fā)編程之線程掛起、恢復與終止
- java 高并發(fā)中volatile的實現(xiàn)原理
- java web如何解決瞬間高并發(fā)
- JAVA多線程并發(fā)下的單例模式應用
- 簡單談談RxJava和多線程并發(fā)
- java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法
- Java 并發(fā)編程之ThreadLocal詳解及實例
- Java并發(fā)之不可思議的死循環(huán)詳解
- 淺談Java線程并發(fā)知識點
- Java 高并發(fā)十: JDK8對并發(fā)的新支持詳解
- Java 高并發(fā)八:NIO和AIO詳解
- 使用java的HttpClient實現(xiàn)多線程并發(fā)
- java并發(fā)之ArrayBlockingQueue詳細介紹
相關文章
springBoot的事件機制GenericApplicationListener用法解析
這篇文章主要介紹了springBoot的事件機制GenericApplicationListener用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值的相關資料2019-09-09
SpringBoot配置默認HikariCP數(shù)據(jù)源
咱們開發(fā)項目的過程中用到很多的開源數(shù)據(jù)庫鏈接池,比如druid、c3p0、BoneCP等等,本文主要介紹了SpringBoot配置默認HikariCP數(shù)據(jù)源,具有一定的參考價值,感興趣的可以了解一下2023-11-11
Spring Boot 使用 Swagger 構建 RestAPI 接口文檔
這篇文章主要介紹了Spring Boot 使用 Swagger 構建 RestAPI 接口文檔,幫助大家更好的理解和使用Spring Boot框架,感興趣的朋友可以了解下2020-10-10

