大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 淺談Java多線程互斥鎖

淺談Java多線程互斥鎖

更新時間:2020-11-24 17:33:46 來源:動力節(jié)點 瀏覽1376次

為了解決競爭條件帶來的問題,我們可以對資源上鎖。多個線程共同讀寫的資源稱為共享資源,也叫臨界資源。涉及操作臨界資源的代碼區(qū)域稱為臨界區(qū)(Critical Section)。同一時刻,只能有一個線程進入臨界區(qū)。我們把這種情況稱為互斥,即不允許多個線程同時對共享資源進行操作,在同一時間只能被一個線程所占有的鎖稱之為Java多線程互斥鎖


互斥鎖在java中的實現(xiàn)就是 ReetranLock , 在訪問一個同步資源時,它的對象需要通過方法 tryLock() 獲得這個鎖,如果失敗,返回 false,成功返回true。根據(jù)返回的信息來判斷是否要訪問這個被同步的資源。ReentrantLock 互斥鎖是可重入鎖,即某一線程可多次獲得該鎖。

 

進入臨界區(qū)前,需要先獲得互斥鎖。如果已經(jīng)有線程正在使用資源,那么需要一直等待,直到其它線程歸還互斥鎖。

操作完共享資源之后,即退出臨界區(qū)時,需要歸還互斥鎖,以便其它等待使用該資源的線程能夠進入臨界區(qū)。

 

偽代碼示例:

 

wait(lock); //獲得互斥鎖

{

    臨界區(qū),操作共享資源

}

signal(lock); //歸還互斥鎖

Java 中可以使用 ReentrantLock 對臨界區(qū)上鎖,防止多個線程同時進入臨界區(qū):

 

private static Lock bufferLock = new ReentrantLock();

 

public static void print(String msg) {

    bufferLock.lock();

    //臨界區(qū),操作臨界資源 globalBuffer

    bufferLock.unlock();

}

這里我們只需要在臨界區(qū)前使用 lock() 上鎖,在臨界區(qū)后使用 unlock() 解鎖即可,java.util.concurrent 幫我們實現(xiàn)了臨界區(qū)前判斷鎖狀態(tài)的工作,會自己決定是阻塞還是進入臨界區(qū)。

 

synchronized 關(guān)鍵字

java 為我們提供了更加簡便的方式,用于實現(xiàn)臨界區(qū)的互斥。

 

例如,我們可以為操作共享資源的函數(shù)加上 synchronized 關(guān)鍵字:

 

public synchronized void myFunction() {

    //操作共享資源 A

}

通過這種方式,能夠確保同一時刻最多只有一個線程在執(zhí)行該函數(shù)。如果資源 A 只在該函數(shù)中讀寫,那么可以保證資源 A 不會出現(xiàn)被多個線程同時讀寫的情況。

 

但是,如果在其它函數(shù)中也對共享資源 A 進行操作,那么就不能使用這種方式來實現(xiàn)資源的使用互斥。因為即使這些函數(shù)都聲明為 synchronized,也只是說明同一時刻不能有多個線程執(zhí)行同一個函數(shù),但允許多個線程同時執(zhí)行不同的函數(shù),而這些函數(shù)都在操作同一個資源 A。

 

下面我們給出另一種方法來實現(xiàn)資源使用的互斥鎖。

synchronized 代碼塊

通過聲明函數(shù)為 synchronized 的方式,只能實現(xiàn)函數(shù)體的互斥。要確保資源使用的互斥,即同一時刻只能有一個線程使用該資源,可以將操作資源 A 的語句放入 synchronized 代碼塊:

 

public void function1() {

    ......

    synchronized (A) {

        //操作資源 A

    }

    ......

}

 

public void function2() {

    ......

    synchronized (A) {

        //操作資源 A

    }

    ......

}

這樣,對于資源 A 來說,同一時刻,只能有一個對應(yīng)的 synchronized 代碼塊執(zhí)行。因此,無論是在哪個地方使用資源 A,都不會出現(xiàn)多個線程競爭該資源的情況。


由ReentrantLock 的構(gòu)造函數(shù)可見,在實例化 ReentrantLock 的時候我們可以選擇實例化一個公平鎖或非公平鎖,而默認會構(gòu)造一個非公平鎖。公平鎖與非公平鎖區(qū)別在于競爭鎖時的有序與否。Java多線程互斥鎖ReentrantLock是通過繼承接口Lock而實現(xiàn)的,類似的還有繼承 ReadWriteLock 實現(xiàn)的 ReentrantReadWriteLock(讀寫鎖),對此,在本站的Java多線程教程中有進一步的講解。


提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 香蕉精品在线 | 久久天天躁夜夜躁狠狠躁2015 | 永久免费的啪啪免费的网址 | 一级毛片私人影院老司机 | 久久99精品这里精品动漫6 | 色涩网站| 国产一级在线视频 | 日本午夜在线视频 | 国产99精品在线观看 | 欧美亚洲高清 | 中国美女牲交一级毛片 | 99re久久在热线播放最新地址 | 成人看的午夜免费毛片 | 在线日韩一区 | 五月婷婷开心中文字幕 | 欧美日韩高清一区二区三区 | 国产第一综合另类色区奇米 | 4虎在线 | 四虎国产精品免费久久麻豆 | 成 人 黄 色 | 久久频这里精品99香蕉久网址 | 91成人在线视频 | 亚洲欧洲精品视频 | 思思久久这里只精品99re66 | 一级毛片一级毛片一级毛片 | 国产综合成人久久大片91 | 色综合五月婷婷 | 中国国产一级毛片 | 欧美视频一二三区 | 亚洲精品一区二区 | 欧美激情在线观看一区二区三区 | 丁香婷婷六月 | 国产在线免| 四虎精品免费久久 | 天天操天天射天天舔 | 天天射天 | 亚洲欧美天堂网 | 日韩第3页 | 欧美精品成人一区二区视频一 | 国产大片中文字幕在线观看 | 欧美一级成人毛片影院 |