Lock對象
同步代碼依賴于簡單的可重入鎖,這種鎖易于使用,但有許多限制,java.util.concurrent.locks包支持更復(fù)雜的鎖定語法,我們不會詳細(xì)檢查這個包,而是將重點(diǎn)放在其最基本的接口Lock上。
Lock對象的工作方式與同步代碼使用的隱式鎖定非常相似,與隱式鎖一樣,一次只有一個線程可以擁有一個Lock對象,Lock對象還通過其關(guān)聯(lián)的Condition對象支持wait/notify機(jī)制。
Lock對象優(yōu)于隱式鎖的最大優(yōu)點(diǎn)是它們能夠退出獲取鎖的嘗試,如果鎖立即不可用或超時到期之前(如果指定),則tryLock方法退出,如果另一個線程在鎖被獲得之前發(fā)送中斷,則lockInterruptibly方法將退出。
讓我們使用Lock對象來解決我們在活性中看到的死鎖問題,Alphonse和Gaston訓(xùn)練自己注意朋友什么時候要鞠躬。我們通過要求我們的Friend對象必須在繼續(xù)執(zhí)行bow之前獲取兩個參與者的鎖來對此進(jìn)行建模,以下是改進(jìn)模型Safelock的源代碼。為了演示這個語法的多功能性,我們假設(shè)Alphonse和Gaston如此迷戀他們新發(fā)現(xiàn)的安全鞠躬能力,他們不能停止相互鞠躬:
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.Random; public class Safelock { static class Friend { private final String name; private final Lock lock = new ReentrantLock(); public Friend(String name) { this.name = name; } public String getName() { return this.name; } public boolean impendingBow(Friend bower) { Boolean myLock = false; Boolean yourLock = false; try { myLock = lock.tryLock(); yourLock = bower.lock.tryLock(); } finally { if (! (myLock && yourLock)) { if (myLock) { lock.unlock(); } if (yourLock) { bower.lock.unlock(); } } } return myLock && yourLock; } public void bow(Friend bower) { if (impendingBow(bower)) { try { System.out.format("%s: %s has" + " bowed to me!%n", this.name, bower.getName()); bower.bowBack(this); } finally { lock.unlock(); bower.lock.unlock(); } } else { System.out.format("%s: %s started" + " to bow to me, but saw that" + " I was already bowing to" + " him.%n", this.name, bower.getName()); } } public void bowBack(Friend bower) { System.out.format("%s: %s has" + " bowed back to me!%n", this.name, bower.getName()); } } static class BowLoop implements Runnable { private Friend bower; private Friend bowee; public BowLoop(Friend bower, Friend bowee) { this.bower = bower; this.bowee = bowee; } public void run() { Random random = new Random(); for (;;) { try { Thread.sleep(random.nextInt(10)); } catch (InterruptedException e) {} bowee.bow(bower); } } } public static void main(String[] args) { final Friend alphonse = new Friend("Alphonse"); final Friend gaston = new Friend("Gaston"); new Thread(new BowLoop(alphonse, gaston)).start(); new Thread(new BowLoop(gaston, alphonse)).start(); } }上一篇:高級并發(fā)對象 下一篇:執(zhí)行器
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73045.html
摘要:在接下來的分鐘,你將會學(xué)會如何通過同步關(guān)鍵字,鎖和信號量來同步訪問共享可變變量。所以在使用樂觀鎖時,你需要每次在訪問任何共享可變變量之后都要檢查鎖,來確保讀鎖仍然有效。 原文:Java 8 Concurrency Tutorial: Synchronization and Locks譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 歡迎閱讀我的Java8并發(fā)教程的第二部分。這份指南將...
摘要:創(chuàng)建一個阻塞隊(duì)列生產(chǎn)者生產(chǎn),目前總共有消費(fèi)者消費(fèi),目前總共有原文鏈接更多教程 原文鏈接 更多教程 本文概要 生產(chǎn)者和消費(fèi)者問題是線程模型中老生常談的問題,也是面試中經(jīng)常遇到的問題。光在Java中的實(shí)現(xiàn)方式多達(dá)數(shù)十種,更不用說加上其他語言的實(shí)現(xiàn)方式了。那么我們該如何學(xué)習(xí)呢? 本文會通過精講wait()和notify()方法實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模型,來學(xué)習(xí)生產(chǎn)者和消費(fèi)者問題的原理。 目的...
高級并發(fā)對象 到目前為止,本課程重點(diǎn)關(guān)注從一開始就是Java平臺一部分的低級別API,這些API適用于非?;A(chǔ)的任務(wù),但更高級的任務(wù)需要更高級別的構(gòu)建塊,對于充分利用當(dāng)今多處理器和多核系統(tǒng)的大規(guī)模并發(fā)應(yīng)用程序尤其如此。 在本節(jié)中,我們將介紹Java平臺5.0版中引入的一些高級并發(fā)功能,大多數(shù)這些功能都在新的java.util.concurrent包中實(shí)現(xiàn),Java集合框架中還有新的并發(fā)數(shù)據(jù)結(jié)構(gòu)。 ...
摘要:執(zhí)行會重新將設(shè)置為,并且通知喚醒其中一個若有的話在方法中調(diào)用了函數(shù)而處于等待狀態(tài)的線程。除此之外,我們需要記錄同一個線程重復(fù)對一個鎖對象加鎖的次數(shù)。競爭失敗的線程處于就緒狀態(tài),長期競爭失敗的線程就會饑餓。 tutorials site Locks in java Locks (and other more advanced synchronization mechanisms...
閱讀 3928·2021-11-24 09:38
閱讀 3110·2021-11-17 09:33
閱讀 3880·2021-11-10 11:48
閱讀 1248·2021-10-14 09:48
閱讀 3139·2019-08-30 13:14
閱讀 2559·2019-08-29 18:37
閱讀 3404·2019-08-29 12:38
閱讀 1423·2019-08-29 12:30