Lock對象
同步代碼依賴于簡單的可重入鎖,這種鎖易于使用,但有許多限制,java.util.concurrent.locks包支持更復雜的鎖定語法,我們不會詳細檢查這個包,而是將重點放在其最基本的接口Lock上。
Lock對象的工作方式與同步代碼使用的隱式鎖定非常相似,與隱式鎖一樣,一次只有一個線程可以擁有一個Lock對象,Lock對象還通過其關聯的Condition對象支持wait/notify機制。
Lock對象優于隱式鎖的最大優點是它們能夠退出獲取鎖的嘗試,如果鎖立即不可用或超時到期之前(如果指定),則tryLock方法退出,如果另一個線程在鎖被獲得之前發送中斷,則lockInterruptibly方法將退出。
讓我們使用Lock對象來解決我們在活性中看到的死鎖問題,Alphonse和Gaston訓練自己注意朋友什么時候要鞠躬。我們通過要求我們的Friend對象必須在繼續執行bow之前獲取兩個參與者的鎖來對此進行建模,以下是改進模型Safelock的源代碼。為了演示這個語法的多功能性,我們假設Alphonse和Gaston如此迷戀他們新發現的安全鞠躬能力,他們不能停止相互鞠躬:
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(); } }上一篇:高級并發對象 下一篇:執行器
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73045.html
摘要:在接下來的分鐘,你將會學會如何通過同步關鍵字,鎖和信號量來同步訪問共享可變變量。所以在使用樂觀鎖時,你需要每次在訪問任何共享可變變量之后都要檢查鎖,來確保讀鎖仍然有效。 原文:Java 8 Concurrency Tutorial: Synchronization and Locks譯者:飛龍 協議:CC BY-NC-SA 4.0 歡迎閱讀我的Java8并發教程的第二部分。這份指南將...
摘要:創建一個阻塞隊列生產者生產,目前總共有消費者消費,目前總共有原文鏈接更多教程 原文鏈接 更多教程 本文概要 生產者和消費者問題是線程模型中老生常談的問題,也是面試中經常遇到的問題。光在Java中的實現方式多達數十種,更不用說加上其他語言的實現方式了。那么我們該如何學習呢? 本文會通過精講wait()和notify()方法實現生產者-消費者模型,來學習生產者和消費者問題的原理。 目的...
高級并發對象 到目前為止,本課程重點關注從一開始就是Java平臺一部分的低級別API,這些API適用于非常基礎的任務,但更高級的任務需要更高級別的構建塊,對于充分利用當今多處理器和多核系統的大規模并發應用程序尤其如此。 在本節中,我們將介紹Java平臺5.0版中引入的一些高級并發功能,大多數這些功能都在新的java.util.concurrent包中實現,Java集合框架中還有新的并發數據結構。 ...
摘要:執行會重新將設置為,并且通知喚醒其中一個若有的話在方法中調用了函數而處于等待狀態的線程。除此之外,我們需要記錄同一個線程重復對一個鎖對象加鎖的次數。競爭失敗的線程處于就緒狀態,長期競爭失敗的線程就會饑餓。 tutorials site Locks in java Locks (and other more advanced synchronization mechanisms...
閱讀 3917·2021-11-24 09:38
閱讀 3088·2021-11-17 09:33
閱讀 3863·2021-11-10 11:48
閱讀 1234·2021-10-14 09:48
閱讀 3123·2019-08-30 13:14
閱讀 2543·2019-08-29 18:37
閱讀 3386·2019-08-29 12:38
閱讀 1410·2019-08-29 12:30