摘要:二模式案例該案例會保存數(shù)據(jù)的屬性,之前所保存的屬性都會被覆蓋。當(dāng)線程執(zhí)行時,只有滿足警戒條件時,才會繼續(xù)執(zhí)行,否則會立即返回。警戒條件的成立與否,會隨著參與者的狀態(tài)而變化。注上述示例中,類就是被警戒的對象參與者,方法是,方法是。
一、定義
Balking是“退縮不前”的意思。Balking Pattern和Guarded Suspension Pattern 一樣需要警戒條件。在Balking Pattern中,當(dāng)警戒條件不成立時,會馬上中斷,而Guarded Suspension Pattern 則是等待到可以執(zhí)行時再去執(zhí)行。
二、模式案例該案例會保存數(shù)據(jù)的屬性,之前所保存的屬性都會被覆蓋。如果當(dāng)前數(shù)據(jù)的屬性與上次保存的屬性并無不同,就不執(zhí)行保存。
Data定義:
public class Data { private String filename; // 文件名 private String content; // 數(shù)據(jù)內(nèi)容 private boolean changed; // 標(biāo)識數(shù)據(jù)是否已修改 public Data(String filename, String content) { this.filename = filename; this.content = content; this.changed = true; } // 修改數(shù)據(jù) public synchronized void change(String newContent) { content = newContent; changed = true; } // 若數(shù)據(jù)有修改,則保存,否則直接返回 public synchronized void save() throws IOException { if (!changed) { System.out.println(Thread.currentThread().getName() + " balks"); return; } doSave(); changed = false; } private void doSave() throws IOException { System.out.println(Thread.currentThread().getName() + " calls doSave, content = " + content); Writer writer = new FileWriter(filename); writer.write(content); writer.close(); } }
修改線程定義:
//修改線程模仿“一邊修改文章,一邊保存” public class ChangerThread extends Thread { private Data data; private Random random = new Random(); public ChangerThread(String name, Data data) { super(name); this.data = data; } public void run() { try { for (int i = 0; true; i++) { data.change("No." + i); Thread.sleep(random.nextInt(1000)); data.save(); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
存儲線程定義:
//存儲線程每個1s,會對數(shù)據(jù)進行一次保存,就像文本處理軟件的“自動保存”一樣。 public class SaverThread extends Thread { private Data data; public SaverThread(String name, Data data) { super(name); this.data = data; } public void run() { try { while (true) { data.save(); // 存儲資料 Thread.sleep(1000); // 休息約1秒 } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
執(zhí)行:
public class Main { public static void main(String[] args) { Data data = new Data("data.txt", "(empty)"); new ChangerThread("ChangerThread", data).start(); new SaverThread("SaverThread", data).start(); } }三、模式講解
Balking 模式的角色如下:
GuardedObject(被警戒的對象)參與者
GuardedObject參與者是一個擁有被警戒的方法(guardedMethod)的類。當(dāng)線程執(zhí)行g(shù)uardedMethod時,只有滿足警戒條件時,才會繼續(xù)執(zhí)行,否則會立即返回。警戒條件的成立與否,會隨著GuardedObject參與者的狀態(tài)而變化。
注:上述示例中,Data類就是GuardedObject(被警戒的對象)參與者,save方法是guardedMethod,change方法是stateChangingMethod。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/71485.html
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進步歡迎點贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
摘要:一主存儲器與工作存儲器內(nèi)存模型分為主存儲器和工作存儲器兩種。工作存儲器每個線程各自獨立所擁有的作業(yè)區(qū),在中,存有中的部分拷貝,稱之為工作拷貝。注意線程欲退出時,不會執(zhí)行工作存儲器的釋放操作。 一、主存儲器與工作存儲器 Java內(nèi)存模型(memory model)分為主存儲器(main memory)和工作存儲器(working memory)兩種。 主存儲器(main memory)...
摘要:在時,引入了包,該包中的大多數(shù)同步器都是基于來構(gòu)建的??蚣芴峁┝艘惶淄ㄓ玫臋C制來管理同步狀態(tài)阻塞喚醒線程管理等待隊列。指針用于在結(jié)點線程被取消時,讓當(dāng)前結(jié)點的前驅(qū)直接指向當(dāng)前結(jié)點的后驅(qū)完成出隊動作。 showImg(https://segmentfault.com/img/remote/1460000016012438); 本文首發(fā)于一世流云的專欄:https://segmentfau...
摘要:前言三年后端開發(fā)經(jīng)驗,面的目標(biāo)崗位是的高級后端開發(fā)。面試結(jié)束,應(yīng)該沒有后續(xù)。 前言 三年Java后端開發(fā)經(jīng)驗,面的目標(biāo)崗位是20k-35k的高級后端Java開發(fā)。 第一場,基本裸面,關(guān)于曾經(jīng)的項目部門答的不好,所以還是得好好準備。 某C輪在線旅游公司 筆試 先做半個小時的筆試題,一共六個題目,兩道go語言的基礎(chǔ)題,一道斐波那契相關(guān),一道數(shù)據(jù)庫行列轉(zhuǎn)置,一道實現(xiàn)一個棧,還有一道是百萬計...
摘要:歡迎進入基礎(chǔ)課程博客地址本系列文章將主要針對一些基礎(chǔ)知識點進行講解,為平時歸納所總結(jié),不管是剛接觸開發(fā)菜鳥還是業(yè)界資深人士,都希望對廣大同行帶來一些幫助。是同步的,而不是。因此,更適合于單線程環(huán)境,而適合于多線程環(huán)境。 歡迎進入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎(chǔ)知識點進行講解,為平時歸納所總...
閱讀 3052·2021-11-24 09:39
閱讀 2575·2019-08-30 15:53
閱讀 3107·2019-08-30 13:47
閱讀 1424·2019-08-30 12:50
閱讀 1565·2019-08-29 16:31
閱讀 2732·2019-08-29 13:14
閱讀 1648·2019-08-29 10:55
閱讀 881·2019-08-26 13:32