成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java? 教程(Lock對象)

RobinQu / 1223人閱讀

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

相關(guān)文章

  • Java 8 并發(fā)教程:同步和鎖

    摘要:在接下來的分鐘,你將會學(xué)會如何通過同步關(guān)鍵字,鎖和信號量來同步訪問共享可變變量。所以在使用樂觀鎖時,你需要每次在訪問任何共享可變變量之后都要檢查鎖,來確保讀鎖仍然有效。 原文:Java 8 Concurrency Tutorial: Synchronization and Locks譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 歡迎閱讀我的Java8并發(fā)教程的第二部分。這份指南將...

    wyk1184 評論0 收藏0
  • Java精講:生產(chǎn)者-消費(fèi)者

    摘要:創(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)者問題的原理。 目的...

    VPointer 評論0 收藏0
  • Java? 教程(高級并發(fā)對象

    高級并發(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)。 ...

    xiaotianyi 評論0 收藏0
  • 并發(fā)學(xué)習(xí)筆記 (5)

    摘要:執(zhí)行會重新將設(shè)置為,并且通知喚醒其中一個若有的話在方法中調(diào)用了函數(shù)而處于等待狀態(tài)的線程。除此之外,我們需要記錄同一個線程重復(fù)對一個鎖對象加鎖的次數(shù)。競爭失敗的線程處于就緒狀態(tài),長期競爭失敗的線程就會饑餓。 tutorials site Locks in java Locks (and other more advanced synchronization mechanisms...

    meteor199 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<