亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

Lionad-Morotar / 3239人閱讀

摘要:用線程表示維修的過(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提供了volatilesynchronized的同步手段來(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é)束之后把WashroomisAvailable字段設(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

相關(guān)文章

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

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

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

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

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

    摘要:本文探討并發(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ǔ)...

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

    摘要:程序執(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)行...

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

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

    PiscesYE 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<