成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java并發(fā)編程之線程間通訊(上)wait/notify機(jī)制

Lionad-Morotar / 3193人閱讀

摘要:用線程表示維修的過程維修結(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提供了volatilesynchronized的同步手段來保證通信內(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é)束之后把WashroomisAvailable字段設(shè)置為true,以表示廁所可用。

與此同時,一群急得像熱鍋上的螞蟻的家伙在廁所門前打轉(zhuǎn)轉(zhuǎn),他們想做神馬不用我明說了吧

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74173.html

相關(guān)文章

  • Java并發(fā)編程線程通訊(下)-生產(chǎn)者與消費(fèi)者

    摘要:前文回顧上一篇文章重點(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)用...

    lufficc 評論0 收藏0
  • 第10章:并發(fā)和分布式編程 10.1并發(fā)性和線程安全性

    摘要:并發(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)代...

    instein 評論0 收藏0
  • Java并發(fā)編程筆記(二)

    摘要:本文探討并發(fā)中的其它問題線程安全可見性活躍性等等。當(dāng)閉鎖到達(dá)結(jié)束狀態(tài)時,門打開并允許所有線程通過。在從返回時被叫醒時,線程被放入鎖池,與其他線程競爭重新獲得鎖。 本文探討Java并發(fā)中的其它問題:線程安全、可見性、活躍性等等。 在行文之前,我想先推薦以下兩份資料,質(zhì)量很高:極客學(xué)院-Java并發(fā)編程讀書筆記-《Java并發(fā)編程實(shí)戰(zhàn)》 線程安全 《Java并發(fā)編程實(shí)戰(zhàn)》中提到了太多的術(shù)語...

    NickZhou 評論0 收藏0
  • Java線程編程基礎(chǔ)——Thread 類

    摘要:程序執(zhí)行時,至少會有一個線程在運(yùn)行,這個運(yùn)行的線程被稱為主線程。程序的終止是指除守護(hù)線程以外的線程全部終止。多線程程序由多個線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會拋出異常。 線程 我們在閱讀程序時,表面看來是在跟蹤程序的處理流程,實(shí)際上跟蹤的是線程的執(zhí)行。 單線程程序 在單線程程序中,在某個時間點(diǎn)執(zhí)行的處理只有一個。 Java 程序執(zhí)行時,至少會有一個線程在運(yùn)行...

    zhoutk 評論0 收藏0
  • Java線程學(xué)習(xí)(四)等待/通知(wait/notify機(jī)制

    摘要:運(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)鍵...

    PiscesYE 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<