摘要:會要求線程等候,以保障實(shí)例的安全性,其它類似的稱呼還有等。警戒條件是否成立隨著的狀態(tài)而變化。注意需要使用,這樣可以使從被喚醒的線程在繼續(xù)向下執(zhí)行前檢查條件。
一、定義
guarded是“被保護(hù)著的”、“被防衛(wèi)著的”意思,suspension則是“暫停”的意思。當(dāng)現(xiàn)在并不適合馬上執(zhí)行某個操作時,就要求想要執(zhí)行該操作的線程等待,這就是Guarded Suspension Pattern。
Guarded Suspension Pattern 會要求線程等候,以保障實(shí)例的安全性,其它類似的稱呼還有g(shù)uarded wait、spin lock等。
下面的案例是一種簡單的消息處理模型,客戶端線程發(fā)起請求,有請求隊列緩存請求,然后發(fā)送給服務(wù)端線程進(jìn)行處理。
Request類:
//request類表示請求 public class Request { private final String name; public Request(String name) { this.name = name; } public String getName() { return name; } public String toString() { return "[ Request " + name + " ]"; } }
客戶端線程類:
//客戶端線程不斷生成請求,插入請求隊列 public class ClientThread extends Thread { private Random random; private RequestQueue requestQueue; public ClientThread(RequestQueue requestQueue, String name, long seed) { super(name); this.requestQueue = requestQueue; this.random = new Random(seed); } public void run() { for (int i = 0; i < 10000; i++) { Request request = new Request("No." + i); System.out.println(Thread.currentThread().getName() + " requests " + request); requestQueue.putRequest(request); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { } } } }
服務(wù)端線程類:
//客戶端線程不斷從請求隊列中獲取請求,然后處理請求 public class ServerThread extends Thread { private Random random; private RequestQueue requestQueue; public ServerThread(RequestQueue requestQueue, String name, long seed) { super(name); this.requestQueue = requestQueue; this.random = new Random(seed); } public void run() { for (int i = 0; i < 10000; i++) { Request request = requestQueue.getRequest(); System.out.println(Thread.currentThread().getName() + " handles " + request); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { } } } }
請求隊列類:
public class RequestQueue { private final LinkedListqueue = new LinkedList (); public synchronized Request getRequest() { while (queue.size() <= 0) { try { wait(); } catch (InterruptedException e) { } } return (Request)queue.removeFirst(); } public synchronized void putRequest(Request request) { queue.addLast(request); notifyAll(); } }
注:getRequest方法中有一個判斷while (queue.size() <= 0),該判斷稱為Guarded Suspension Pattern 的警戒條件(guard condition)。
執(zhí)行:
public class Main { public static void main(String[] args) { RequestQueue requestQueue = new RequestQueue(); new ClientThread(requestQueue, "Alice", 3141592L).start(); new ServerThread(requestQueue, "Bobby", 6535897L).start(); } }三、模式講解
角色:
Guarded Suspension Pattern 的角色如下:
GuardedObject (被防衛(wèi)的對象)參與者
GuardedObject 參與者是一個擁有被防衛(wèi)的方法(guardedMethod)的類。當(dāng)線程執(zhí)行g(shù)uardedMethod時,只要滿足警戒條件,就能繼續(xù)執(zhí)行,否則線程會進(jìn)入wait set區(qū)等待。警戒條件是否成立隨著GuardedObject的狀態(tài)而變化。
GuardedObject 參與者除了guardedMethod外,可能還有用來更改實(shí)例狀態(tài)的的方法stateChangingMethod。
在Java語言中,是使用while語句和wait方法來實(shí)現(xiàn)guardedMethod的;使用notify/notifyAll方法實(shí)現(xiàn)stateChangingMethod。如案例中的RequestQueue 類。
注意:Guarded Suspension Pattern 需要使用while,這樣可以使從wait set被喚醒的線程在繼續(xù)向下執(zhí)行前檢查Guard條件。如果改用if,當(dāng)多個線程被喚醒時,由于wait是繼續(xù)向下執(zhí)行的,可能會出現(xiàn)問題。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71486.html
摘要:二模式案例該案例會保存數(shù)據(jù)的屬性,之前所保存的屬性都會被覆蓋。當(dāng)線程執(zhí)行時,只有滿足警戒條件時,才會繼續(xù)執(zhí)行,否則會立即返回。警戒條件的成立與否,會隨著參與者的狀態(tài)而變化。注上述示例中,類就是被警戒的對象參與者,方法是,方法是。 一、定義 Balking是退縮不前的意思。Balking Pattern和Guarded Suspension Pattern 一樣需要警戒條件。在Balk...
摘要:初始時,為,當(dāng)調(diào)用方法時,線程的加,當(dāng)調(diào)用方法時,如果為,則調(diào)用線程進(jìn)入阻塞狀態(tài)。該對象一般供監(jiān)視診斷工具確定線程受阻塞的原因時使用。 showImg(https://segmentfault.com/img/remote/1460000016012503); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... 一、LockSupport類簡介...
摘要:二接口簡介可以看做是類的方法的替代品,與配合使用。當(dāng)線程執(zhí)行對象的方法時,當(dāng)前線程會立即釋放鎖,并進(jìn)入對象的等待區(qū),等待其它線程喚醒或中斷。 showImg(https://segmentfault.com/img/remote/1460000016012601); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... 本系列文章中所說的juc-...
摘要:關(guān)于,這個方法只會喚醒一個線程,并且不允許指定喚醒哪個線程,這是可能會發(fā)生死鎖的。使用不可變對象降低了垃圾回收所產(chǎn)生的額外開銷,同時也可以減少一些為了維護(hù)在并發(fā)中的的代碼開銷。 前言 跟著 The Java Tutorials 把并發(fā)的一些基礎(chǔ)過了一遍,發(fā)現(xiàn)仍然還是有很多不清楚的地方,主要是因為平常沒有機(jī)會實(shí)際應(yīng)用吧,理論知識要有,實(shí)踐也很重要,哪怕是寫些小 demo 也可以的。 雖然...
多態(tài)性 多態(tài)性的字典定義是指生物學(xué)中的原理,其中生物體或物種可以具有許多不同的形式或階段,這個原則也可以應(yīng)用于面向?qū)ο蟮木幊毯拖馢ava語言之類的語言,類的子類可以定義它們自己的唯一行為,但仍然共享父類的一些相同功能。 可以通過對Bicycle類的微小修改來演示多態(tài)性,例如,可以將printDescription方法添加到顯示當(dāng)前存儲在實(shí)例中的所有數(shù)據(jù)的類中。 public void printD...
閱讀 1865·2023-04-25 14:28
閱讀 1901·2021-11-19 09:40
閱讀 2803·2021-11-17 09:33
閱讀 1391·2021-11-02 14:48
閱讀 1716·2019-08-29 16:36
閱讀 3340·2019-08-29 16:09
閱讀 2923·2019-08-29 14:17
閱讀 2388·2019-08-29 14:07