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