Java 高級并發(fā)對象之 Lock 對象

同步代碼依賴于一種簡單的可重入鎖。這種鎖很容易使用,但有很多限制。 java.util.concurrent.locks 包支持更復(fù)雜的鎖定方式。我們不會詳細(xì)的研究這個包,而是將重點放在它最基本的接口Lock上。

鎖對象非常像 synchronized 代碼使用的隱式鎖。與隱式鎖一樣,一次只有一個線程擁有一個 Lock 對象。Lock 對象還通過其關(guān)聯(lián)的 Condition 對象支持 wait /notify 機(jī)制。

Lock 對象比隱式鎖好的一點是它能退出嘗試獲取鎖。如果鎖定不是立即可用或在超時 到期之前(如果指定的話),tryLock 方法將會退出。如果另一個線程在獲取鎖之前發(fā)出中斷,lockInterruptibly 方法將會退出。

讓我們使用 Lock 對象來解決我們在 Liveness 中看到的死鎖問題。Alphonse 和 Gaston 已經(jīng)訓(xùn)練自己注意什么時候朋友要鞠躬。我們通過要求我們的 Friend 對象在繼續(xù)前進(jìn)之前必須獲取兩個參與者的鎖來模擬這種改進(jìn)。這里是改進(jìn)的模型 Safelock 的源代碼。為了證明這個習(xí)慣用法的多樣性,我們假定 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();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • 摘要: 我們已經(jīng)知道,synchronized 是Java的關(guān)鍵字,是Java的內(nèi)置特性,在JVM層面實現(xiàn)了對臨界...
    kingZXY2009閱讀 1,881評論 0 20
  • 1.解決信號量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 1,015評論 0 1
  • layout: posttitle: 《Java并發(fā)編程的藝術(shù)》筆記categories: Javaexcerpt...
    xiaogmail閱讀 6,022評論 1 19
  • 原文鏈接 譯者:靖靖 并發(fā) 進(jìn)程和線程 在并發(fā)編程當(dāng)中,有兩個基本的執(zhí)行單元:進(jìn)程和線程。在java中,我們大部分...
    4b4f3ceb6f71閱讀 851評論 4 16

友情鏈接更多精彩內(nèi)容