摘要:用線程表示維修的過程維修結(jié)束把廁所置為可用狀態(tài)維修工把廁所修好了,準(zhǔn)備釋放鎖了這個維修計劃的內(nèi)容就是當(dāng)維修工進(jìn)入廁所之后,先把門鎖上,然后開始維修,維修結(jié)束之后把的字段設(shè)置為,以表示廁所可用。
線程間通信
如果一個線程從頭到尾執(zhí)行完也不和別的線程打交道的話,那就不會有各種安全性問題了。但是協(xié)作越來越成為社會發(fā)展的大勢,一個大任務(wù)拆成若干個小任務(wù)之后,各個小任務(wù)之間可能也需要相互協(xié)作最終才能執(zhí)行完整個大任務(wù)。所以各個線程在執(zhí)行過程中可以相互通信,所謂通信就是指相互交換一些數(shù)據(jù)或者發(fā)送一些控制指令,比如一個線程給另一個暫停執(zhí)行的線程發(fā)送一個恢復(fù)執(zhí)行的指令,下邊詳細(xì)看都有哪些通信方式。
volatile和synchronized可變共享變量是天然的通信媒介,也就是說一個線程如果想和另一個線程通信的話,可以修改某個在多線程間共享的變量,另一個線程通過讀取這個共享變量來獲取通信的內(nèi)容。
由于原子性操作、內(nèi)存可見性和指令重排序的存在,java提供了volatile和synchronized的同步手段來保證通信內(nèi)容的正確性,假如沒有這些同步手段,一個線程的寫入不能被另一個線程立即觀測到,那這種通信就是不靠譜的~
wait/notify機(jī)制故事背景
也不知道是那個遭天殺的給我們學(xué)校廁所的坑里塞了個塑料瓶,導(dǎo)致樓道里如黃河泛濫一般,臭味熏天。更加悲催的是整個樓只有這么一個廁所,比這個更悲催的是這個廁所里只有一個坑?。。。?!好吧,讓我們用java來描述一下這個廁所:
public class Washroom { private volatile boolean isAvailable = false; //表示廁所是否是可用的狀態(tài) private Object lock = new Object(); //廁所門的鎖 public boolean isAvailable() { return isAvailable; } public void setAvailable(boolean available) { this.isAvailable = available; } public Object getLock() { return lock; } }
isAvailable字段代表廁所是否可用,由于廁所損壞,默認(rèn)是false的,lock字段代表這個廁所門的鎖。需要注意的是 isAvailable字段被volatile修飾,也就是說有一個線程修改了它的值,它可以立即對別的線程可見~
由于廁所資源寶貴,英明的學(xué)校領(lǐng)導(dǎo)立即擬定了一個修復(fù)任務(wù):
public class RepairTask implements Runnable { private Washroom washroom; public RepairTask(Washroom washroom) { this.washroom = washroom; } @Override public void run() { synchronized (washroom.getLock()) { System.out.println("維修工 獲取了廁所的鎖"); System.out.println("廁所維修中,維修廁所是一件辛苦活,需要很長時間。。。"); try { Thread.sleep(5000L); //用線程sleep表示維修的過程 } catch (InterruptedException e) { throw new RuntimeException(e); } washroom.setAvailable(true); //維修結(jié)束把廁所置為可用狀態(tài) System.out.println("維修工把廁所修好了,準(zhǔn)備釋放鎖了"); } } }
這個維修計劃的內(nèi)容就是當(dāng)維修工進(jìn)入廁所之后,先把門鎖上,然后開始維修,維修結(jié)束之后把Washroom的isAvailable字段設(shè)置為true,以表示廁所可用。
與此同時,一群急得像熱鍋上的螞蟻的家伙在廁所門前打轉(zhuǎn)轉(zhuǎn),他們想做神馬不用我明說了吧
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74173.html
摘要:前文回顧上一篇文章重點(diǎn)嘮叨了中協(xié)調(diào)線程間通信的機(jī)制,它有力的保證了線程間通信的安全性以及便利性。所以同一時刻廚師線程和服務(wù)員線程不會同時在等待隊列中。對于在操作系統(tǒng)中線程的阻塞狀態(tài),語言中用和這三個狀態(tài)分別表示。 前文回顧 上一篇文章重點(diǎn)嘮叨了java中協(xié)調(diào)線程間通信的wait/notify機(jī)制,它有力的保證了線程間通信的安全性以及便利性。本篇將介紹wait/notify機(jī)制的一個應(yīng)用...
摘要:并發(fā)模塊本身有兩種不同的類型進(jìn)程和線程,兩個基本的執(zhí)行單元。調(diào)用以啟動新線程。在大多數(shù)系統(tǒng)中,時間片發(fā)生不可預(yù)知的和非確定性的,這意味著線程可能隨時暫?;蚧謴?fù)。 大綱 什么是并發(fā)編程?進(jìn)程,線程和時間片交織和競爭條件線程安全 策略1:監(jiān)禁 策略2:不可變性 策略3:使用線程安全數(shù)據(jù)類型 策略4:鎖定和同步 如何做安全論證總結(jié) 什么是并發(fā)編程? 并發(fā)并發(fā)性:多個計算同時發(fā)生。 在現(xiàn)代...
摘要:本文探討并發(fā)中的其它問題線程安全可見性活躍性等等。當(dāng)閉鎖到達(dá)結(jié)束狀態(tài)時,門打開并允許所有線程通過。在從返回時被叫醒時,線程被放入鎖池,與其他線程競爭重新獲得鎖。 本文探討Java并發(fā)中的其它問題:線程安全、可見性、活躍性等等。 在行文之前,我想先推薦以下兩份資料,質(zhì)量很高:極客學(xué)院-Java并發(fā)編程讀書筆記-《Java并發(fā)編程實(shí)戰(zhàn)》 線程安全 《Java并發(fā)編程實(shí)戰(zhàn)》中提到了太多的術(shù)語...
摘要:程序執(zhí)行時,至少會有一個線程在運(yùn)行,這個運(yùn)行的線程被稱為主線程。程序的終止是指除守護(hù)線程以外的線程全部終止。多線程程序由多個線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會拋出異常。 線程 我們在閱讀程序時,表面看來是在跟蹤程序的處理流程,實(shí)際上跟蹤的是線程的執(zhí)行。 單線程程序 在單線程程序中,在某個時間點(diǎn)執(zhí)行的處理只有一個。 Java 程序執(zhí)行時,至少會有一個線程在運(yùn)行...
摘要:運(yùn)行可運(yùn)行狀態(tài)的線程獲得了時間片,執(zhí)行程序代碼。阻塞的情況分三種一等待阻塞運(yùn)行的線程執(zhí)行方法,會把該線程放入等待隊列中。死亡線程方法執(zhí)行結(jié)束,或者因異常退出了方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)synchronized關(guān)鍵...
閱讀 1233·2021-11-25 09:43
閱讀 1987·2021-11-11 10:58
閱讀 1209·2021-11-08 13:18
閱讀 2710·2019-08-29 16:25
閱讀 3526·2019-08-29 12:51
閱讀 3321·2019-08-29 12:30
閱讀 765·2019-08-26 13:24
閱讀 3699·2019-08-26 10:38