第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對Java核心技術(shù)中一段關(guān)于線程同步的代碼的疑問

對Java核心技術(shù)中一段關(guān)于線程同步的代碼的疑問

繁星coding 2019-03-12 13:15:16
《Java核心技術(shù)第九版 卷I》的14.5.6 Synchronized Blocks一節(jié)有一段代碼:public void transfer(Vector<Double> accounts, int from, int to, int amount) {    synchronized (accounts) {        accounts.set(from, accounts.get(from) - amount);        accounts.set(to, accounts.get(to) + amount);    }    System.out.println(. . .);}這段代碼是模擬銀行轉(zhuǎn)賬的,當(dāng)多個線程并發(fā)地進(jìn)行轉(zhuǎn)賬時,如果不進(jìn)行同步就會導(dǎo)致賬戶中的數(shù)據(jù)出現(xiàn)不一致的情況。所以書里給這段代碼加了synchronized同步。但是書中這段程序后面還有一句話:This approach works, but it is entirely dependent on the fact that the Vector class uses the intrinsic lock for all of its mutator methods.(加了同步之后)這就沒問題了,但是這段代碼完全依賴于Vector類是否使用它自己的鎖來同步它的修改方法。問題來了,為什么這樣寫還要依賴于Vector是否加鎖,以及加鎖方式呢?我認(rèn)為不管Vector是否是同步的這段代碼都沒問題。我實(shí)際測試了,將Vector換成非同步的ArrayList,確實(shí)沒有任何問題!不知道作者為什么這樣說,難道是我哪里理解的不對?
查看完整描述

2 回答

?
犯罪嫌疑人X

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個贊

這句話大概是指 synchronized (accounts) 和 Vector中方法的 intrinsic lock(鎖this) 使用的鎖都是實(shí)例對象本身,所以這種寫法才有效,要保證使用同一個鎖。

假設(shè)有兩個不同的線程類A和B,都持有 accounts 的引用,線程類A啟動的線程使用synchronized (accounts) 加鎖進(jìn)行同步,而線程類B啟動的線程沒有,直接使用 accounts.set 方法進(jìn)行修改。

如果使用 Vector 類,A線程鎖了 accounts 對象,B中調(diào)用 set 方法時,由于 set 方法使用synchronized 修飾,B也需要獲取 this,即:accounts 對象的鎖,才能修改,A線程釋放鎖之前B線程是無法執(zhí)行的。

如果使用 ArrayList 類,B不需要獲取鎖,直接可以進(jìn)行修改,會導(dǎo)致狀態(tài)不一致。


查看完整回答
反對 回復(fù) 2019-04-17
?
胡說叔叔

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個贊

accounts參數(shù)是通過方法調(diào)用傳進(jìn)來的,很難保證在進(jìn)行方法調(diào)用之前,程序?qū)ccounts對象發(fā)布到了其他線程,這樣就有可能有其它線程修改他了。所以作者說依賴于Vector類的同步機(jī)制。比如:


doTransfer() {

    final Vector<Double> accounts = ...

    new Thread(() -> {

        //更改accounts并且沒有進(jìn)行同步

    }).start()

    //調(diào)用transfer

    transfer(accounts .......)

}


查看完整回答
反對 回復(fù) 2019-04-17
  • 2 回答
  • 0 關(guān)注
  • 521 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號