亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java并發編程中構建自定義同步工具

2019-11-26 15:13:13
字體:
來源:轉載
供稿:網友

當Java類庫沒有提供適合的同步工具時,就需要構建自定義同步工具。

可阻塞狀態依賴操作的結構

復制代碼 代碼如下:

acquir lock on object state;//請求獲取鎖
while(precondition does not hold){//沒有滿足前提條件
   release lock;//先釋放鎖
   wait until precondition might hold;//等待滿足前提條件
   optionlly fail if interrupted or timeout expires;//因為中斷或者超時執行失敗
   reacquire lock;//重新嘗試獲取鎖
}
perform action//執行
   release lock;//釋放鎖

有界緩存實現基類示例

復制代碼 代碼如下:

public class BaseBoundBuffer<V> {
private final V[] buf;
private int tail;
private int head;
private int count;
@SuppressWarnings("unchecked")
public BaseBoundBuffer(int capacity) {
buf = (V[]) new Object[capacity];
}
public synchronized void doPut(V v) {
buf[tail] = v;
if (++tail == buf.length)
tail = 0;
count++;
}
public synchronized V doTake() {
V v = buf[head];

if (++head == buf.length)
head = 0;
count--;
return v;
}
public final synchronized boolean isFull() {
return count == buf.length;
}
public final synchronized boolean isEmpty() {
return count == 0;
}
}

阻塞實現方式一:拋異常給調用者

復制代碼 代碼如下:

public synchronized void put1(V v)  throws Exception{
if(isFull())
throw new Exception("full error");
doPut(v);
}

分析:異常應該應用于發生異常情況中,在這里拋異常不合適;需要調用者是處理前提條件失敗的情況,并沒有解決根本問題。
阻塞實現方式二:通過輪詢和休眠
復制代碼 代碼如下:

public void put2(V v) throws InterruptedException {
while (true) {//輪詢
synchronized (this) {
if (!isFull()) {
doPut(v);
return;    
}
}
Thread.sleep(SLEEP_TIME);//休眠
}
}

分析:很難權衡休眠時間SLEEP_TIME設置。如果設置過小,CPU可能會輪詢多次,消耗CPU資源也越高;如果設置過大,響應性就越低。

阻塞實現方式三:條件隊列

條件隊列中的元素是一個個等待相關條件的線程。每個Java對象都可以作為一個鎖,每個對象同樣可以作為一個條件隊列,并且Object中的wait、notify、notifyAll方法就構成了內部條件隊列的API。Object.wait會自動釋放鎖,并請求操作系統掛起當前線程,從而使其它線程能獲得這個鎖并修改對象的狀態。Object.notify和Object.notifyAll能喚醒正在等待線程,從條件隊列中選取一個線程喚醒并嘗試重新獲取鎖。

復制代碼 代碼如下:

public synchronized void put3(V v) throws InterruptedException {
while(isFull())
wait();
doput(v);
notifyAll();
}

分析:獲得較好響應,簡單易用。

使用條件隊列​
1.條件謂詞

1).定義:條件謂詞是使某個操作成為狀態依賴操作的前提條件。條件謂詞是由類中各個狀態變量構成的表達式。例如,對于put方法的條件謂詞就是“緩存不為空”。
2).關系:在條件等待中存在一種重要的三元關系,包括加鎖、wait方法和一個條件謂詞。在條件謂詞中包含多個狀態變量,而每個狀態變量必須由一個鎖來保護,因此在測試條件謂詞之前必須先持有這個鎖。鎖對象和條件隊列對象(及調用wait和notify等方法所在的對象)必須是同一個對象。
3).約束:每次調用wait都會隱式地和特定的條件謂詞相關聯,當調用特定條件謂詞時,調用者必須已經持有與條件隊列相關的鎖,這個鎖必須還保護這組成條件謂詞的狀態變量

2.條件隊列使用規則

1).通常都有一個條件謂詞
2).永遠在調用wait之前測試條件謂詞,并且在wait中返回后再次測試;
3).永遠在循環中調用wait;
4).確保構成條件謂詞的狀態變量被鎖保護,而這個鎖必須與這個條件隊列相關聯;
5).當調用wait、notify和notifyAll時,要持有與條件隊列相關聯的鎖;
6).在檢查條件謂詞之后,開始執行被保護的邏輯之前,不要釋放鎖;

3.通知

盡量使用notifyAll,而不是nofify.因為nofify會隨機喚醒一個線程從休眠狀態變為Blocked狀態(Blocked狀態是種線程一直處于嘗試獲取鎖的狀態,即一旦發現鎖可用,馬上持有鎖),而notifyAll會喚醒條件隊列中所有的線程從休眠狀態變為Blocked狀態.考慮這么種情況,假如線程A因為條件謂詞Pa進入休眠狀態,線程B因為條件謂詞Pb進入休眠狀態.這時Pb為真,線程C執行單一的notify.如果JVM隨機選擇了線程A進行喚醒,那么線程A檢查條件謂詞Pa不為真后又進入了休眠狀態.從這以后再也沒有其它線程能被喚醒,程序會一直處于休眠狀態.如果使用notifyAll就不一樣了,JVM會喚醒條件隊列中所有等待線程從休眠狀態變為Blocked狀態,即使隨機選出一個線程一因為條件謂詞不為真進入休眠狀態,其它線程也會去競爭鎖從而繼續執行下去.

4.狀態依賴方法的標準形式

復制代碼 代碼如下:

void stateDependentMethod throwsInterruptedException{
synchronized(lock){
while(!conditionPredicate))
lock.wait();
}
//dosomething();
....

notifyAll();
}

顯示Condition對象

顯示的Condition對象是一種更靈活的選擇,提供了更豐富的功能:在每個鎖上可以存在多個等待,條件等待可以是中斷的獲不可中斷的,基于時限的等待,以及公平的或非公平的隊列操作。一個Condition可以和一個Lock關聯起來,就像一個條件隊列和一個內置鎖關聯起來一樣。要創建一個Condition,可以在相關聯的Lock上調用Lock.newCondition方法。以下用顯示條件變量重新實現有界緩存

復制代碼 代碼如下:

public class ConditionBoundedBuffer<V> {
 private final V[] buf;
 private int tail;
 private int head;
 private int count;
 private Lock lock = new ReentrantLock();
 private Condition notFullCondition = lock.newCondition();
 private Condition notEmptyCondition = lock.newCondition();
 @SuppressWarnings("unchecked")
 public ConditionBoundedBuffer(int capacity) {
  buf = (V[]) new Object[capacity];
 }

 public void doPut(V v) throws InterruptedException {
  try {
   lock.lock();
   while (count == buf.length)
    notFullCondition.await();
   buf[tail] = v;
   if (++tail == buf.length)
    tail = 0;
   count++;
   notEmptyCondition.signal();
  } finally {
   lock.unlock();
  }

 }

 public V doTake() throws InterruptedException {
  try {
   lock.lock();
   while (count == 0)
    notEmptyCondition.await();
   V v = buf[head];
   buf[head] = null;
   if (++head == buf.length)
    head = 0;
   count--;
   notFullCondition.signal();
   return v;
  } finally {
   lock.unlock();
  }
 }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人欧美在线视频| 国产成人avxxxxx在线看| 国产日韩在线观看av| 久久精品成人欧美大片| 91av视频在线播放| 欧美国产日韩一区二区三区| 国产香蕉精品视频一区二区三区| 久久久久久久999| 亚洲综合精品一区二区| 亚洲国产97在线精品一区| 日韩在线精品一区| 成人午夜高潮视频| 亚洲性av网站| 国产精品久久久久9999| 成人欧美一区二区三区在线湿哒哒| 亚洲一区二区久久久久久| 亚洲视频在线视频| 青青草原一区二区| 日日骚久久av| 成人在线视频福利| 97av在线视频免费播放| 日韩av在线网站| 欧美精品videofree1080p| 国产精品一区久久| 日韩女优人人人人射在线视频| 在线观看精品自拍私拍| 欧美影院成年免费版| 久久精品视频免费播放| 久久精品电影一区二区| 国产精品网红直播| 国产精品99久久久久久久久| 性日韩欧美在线视频| 在线观看日韩www视频免费| 亚洲国产成人一区| 精品毛片三在线观看| 欧美精品在线免费观看| 国产美女精品视频免费观看| 欧美性xxxx在线播放| 亚洲色图五月天| 国产91精品黑色丝袜高跟鞋| 国产精品自拍偷拍视频| 大伊人狠狠躁夜夜躁av一区| 日韩在线资源网| 亚洲三级黄色在线观看| 欧美高跟鞋交xxxxxhd| 国产精品免费视频久久久| 亚洲午夜女主播在线直播| 国产精品久久久久aaaa九色| 国产精品一久久香蕉国产线看观看| 成人精品久久久| 亚洲天堂成人在线视频| 欧美精品video| 91精品免费看| 亚洲精品www久久久久久广东| 欧美性猛交xxxx乱大交极品| 欧美激情精品久久久久久黑人| 91免费视频网站| 亚洲片国产一区一级在线观看| 久久久成人精品视频| 欧美一区二区三区艳史| 日韩欧美福利视频| 日韩欧美成人网| 欧美大肥婆大肥bbbbb| 日韩激情av在线免费观看| 久久影视电视剧免费网站| 国产精品久久久999| 国产精国产精品| 亚洲91av视频| 欧美精品999| 疯狂蹂躏欧美一区二区精品| 5566日本婷婷色中文字幕97| 日韩美女视频在线观看| 欧美一级淫片aaaaaaa视频| 91豆花精品一区| 欧美最顶级丰满的aⅴ艳星| 国产精品视频久久久| 成人激情视频网| 亚洲尤物视频网| 成人乱人伦精品视频在线观看| 欧美一区二区三区免费视| 国产精品96久久久久久又黄又硬| 欧美午夜精品伦理| 色综合久久久888| 国产精品都在这里| 日韩小视频在线| 精品视频久久久久久久| 亚洲久久久久久久久久| 国产精品第3页| 北条麻妃一区二区在线观看| 欧美激情网友自拍| 久久久久久亚洲精品不卡| 欧美视频在线观看免费网址| 欧美日韩国产一区二区| 成人激情在线观看| 日韩网站免费观看高清| 欧美极品少妇xxxxⅹ免费视频| 精品国产一区久久久| 青青a在线精品免费观看| 亚洲国产精品热久久| 国内外成人免费激情在线视频网站| 91亚洲一区精品| 亚洲国产精品久久久久秋霞不卡| 91国产美女在线观看| 成人在线视频网| 中文字幕欧美精品在线| 北条麻妃一区二区在线观看| 7m精品福利视频导航| 91国偷自产一区二区三区的观看方式| 日韩高清人体午夜| 国产一区香蕉久久| 亚洲码在线观看| 欧美超级乱淫片喷水| 国产乱人伦真实精品视频| 国产精品老女人精品视频| 亚洲奶大毛多的老太婆| 亚洲成人黄色在线| 日韩一区二区三区国产| 麻豆国产va免费精品高清在线| 国产精品久久电影观看| 日本欧美爱爱爱| 亚洲精品成人久久电影| 亚洲人成网站色ww在线| 992tv成人免费影院| 亚洲综合在线中文字幕| 欧美老女人bb| 亚洲裸体xxxx| 欧美精品一二区| 日韩在线免费观看视频| 欧美理论片在线观看| 精品无人国产偷自产在线| 精品一区二区三区三区| 久久黄色av网站| 欧美日韩中国免费专区在线看| 另类专区欧美制服同性| 欧美激情一区二区三级高清视频| 色av中文字幕一区| 992tv成人免费视频| 成人精品aaaa网站| 精品国产91久久久久久老师| 福利一区福利二区微拍刺激| www.日韩系列| 91麻豆桃色免费看| 92看片淫黄大片欧美看国产片| 国产在线观看精品一区二区三区| 欧美性猛交xxxx久久久| 91色精品视频在线| 中文字幕亚洲一区二区三区五十路| 亚洲性xxxx| 国产精品第8页| 一个色综合导航| 国产精品视频播放| 国产成人精品免费久久久久| 欧美中文在线视频| 亚洲欧美激情精品一区二区| 久久成人18免费网站| 亚洲欧洲黄色网| 日韩动漫免费观看电视剧高清| 亚洲成年人在线播放| 91老司机精品视频| 九九久久综合网站| 国产女人18毛片水18精品| 中文字幕亚洲欧美日韩2019| 成人网页在线免费观看| 国产精品爽爽爽|