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

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

淺談Java多線程互斥鎖

更新時(shí)間:2020-11-24 17:33:46 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1263次

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


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

 

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

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

 

偽代碼示例:

 

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

{

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

}

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

Java 中可以使用 ReentrantLock 對(duì)臨界區(qū)上鎖,防止多個(gè)線程同時(shí)進(jìn)入臨界區(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 幫我們實(shí)現(xiàn)了臨界區(qū)前判斷鎖狀態(tài)的工作,會(huì)自己決定是阻塞還是進(jìn)入臨界區(qū)。

 

synchronized 關(guān)鍵字

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

 

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

 

public synchronized void myFunction() {

    //操作共享資源 A

}

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

 

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

 

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

synchronized 代碼塊

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

 

public void function1() {

    ......

    synchronized (A) {

        //操作資源 A

    }

    ......

}

 

public void function2() {

    ......

    synchronized (A) {

        //操作資源 A

    }

    ......

}

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


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


提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-04-24 搶座中
  • 全國(guó)校區(qū) 2025-05-15 搶座中
  • 全國(guó)校區(qū) 2025-06-05 搶座中
  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 热灸灸这里只有精品 | 亚洲乱码中文字幕久久 | 日韩成人免费 | 91香蕉嫩草 | 中文字幕一区二区三区精品 | 亚洲精品久久久中文字 | 黄色毛片免费 | 国产一级片毛片 | 精品一区中文字幕 | 欧美深夜影院 | 亚洲欧洲日产国码天堂 | 日本精品久久久久中文字幕2 | 久久99精品视频 | 欧美综合中文字幕久久 | 四虎影视地址 | 99r8这里精品热视频免费看 | 99热久久精里都是精品66 | 免费性生活视频 | 黄色不良视频 | 亚洲国产成人资源在线桃色 | 久久久夜间小视频 | 在线观看免费精品国产 | 国产亚洲精品一品区99热 | 草莓视频caomei888 | 操操日| 美女视频黄是免费的 | 人人澡 人人澡 人人看欧美 | 国产成人综合亚洲欧洲色就色 | 欧美成人精品一区二三区在线观看 | 久热中文字幕在线精品免费 | 国产亚洲女人久久久久久 | 欧美精品色视频 | 香蕉国产 | 日韩免费一区二区三区 | 免费观看欧美精品成人毛片能看的 | 亚洲欧美日韩国产 | 欧美国产亚洲一区二区三区 | 女人十八毛片一级毛片免费看 | 黄色影院免费观看 | 婷婷涩| 第一福利在线观看永久视频 |