摘要:看并發(fā)編程實(shí)戰(zhàn)第章程序清單附件時(shí)對(duì)于下面的話如何理解我的理解是方法等同于他是對(duì)上的鎖,也只能保證同一時(shí)刻只有一個(gè)線程可以訪問(wèn)同一實(shí)例的方法。的是對(duì)進(jìn)行上鎖,因此任何訪問(wèn)的線程安全的方法,同一時(shí)刻只能有一個(gè)線程進(jìn)行。
看《java 并發(fā)編程實(shí)戰(zhàn)》 第4章 程序清單4-14附件時(shí)
class BadListHelper
public Listlist = Collections.synchronizedList(new ArrayList ()); public synchronized boolean putIfAbsent(E x) { boolean absent = !list.contains(x); if (absent) list.add(x); return absent; }
}
@ThreadSafe
class GoodListHelper
public Listlist = Collections.synchronizedList(new ArrayList ()); public boolean putIfAbsent(E x) { synchronized (list) { boolean absent = !list.contains(x); if (absent) list.add(x); return absent; } }
}
對(duì)于BadListHelper 下面的話如何理解?
我的理解是:
public synchronized boolean putIfAbsent(E x)方法等同于
public boolean putIfAbsent(E x){
synchronized (this){
....
}
}
他是對(duì)BadListHelper 上的鎖,也只能保證同一時(shí)刻只有一個(gè)線程可以訪問(wèn)BadListHelper 同一實(shí)例的putIfAbsent方法。但是持有l(wèi)ist的引用的其它線程任然可以使用list其它方法修改list(即使該方法對(duì)應(yīng)list來(lái)說(shuō)是線程安全的、原子的); 但是我們的目的是 為了同一時(shí)刻只能有一個(gè)線程可以修改list。 因此書(shū)上說(shuō) “問(wèn)題在于錯(cuò)誤的鎖上進(jìn)行了同步” 。
GoodListHelper 的putIfAbsent是對(duì)list進(jìn)行上鎖,因此任何訪問(wèn)list的線程安全的方法,同一時(shí)刻只能有一個(gè)線程進(jìn)行。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/67056.html
摘要:學(xué)習(xí)完多線程之后可以通過(guò)下面這些問(wèn)題檢測(cè)自己是否掌握,下面這些問(wèn)題的答案以及常見(jiàn)多線程知識(shí)點(diǎn)的總結(jié)在這里。可選數(shù)據(jù)結(jié)構(gòu)與算法如果你想進(jìn)入大廠的話,我推薦你在學(xué)習(xí)完基礎(chǔ)或者多線程之后,就開(kāi)始每天抽出一點(diǎn)時(shí)間來(lái)學(xué)習(xí)算法和數(shù)據(jù)結(jié)構(gòu)。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問(wèn)題,已經(jīng)開(kāi)源,目前已經(jīng) 35k+ Star。會(huì)一直完善下去,歡迎建議和指導(dǎo),同時(shí)也歡迎Star: https://...
摘要:的主要功能和關(guān)鍵字一致,均是用于多線程的同步。而僅支持通過(guò)查詢當(dāng)前線程是否持有鎖。由于和使用的是同一把可重入鎖,所以線程可以進(jìn)入方法,并再次獲得鎖,而不會(huì)被阻塞住。公平與非公平公平與非公平指的是線程獲取鎖的方式。 1.簡(jiǎn)介 可重入鎖ReentrantLock自 JDK 1.5 被引入,功能上與synchronized關(guān)鍵字類似。所謂的可重入是指,線程可對(duì)同一把鎖進(jìn)行重復(fù)加鎖,而不會(huì)被阻...
摘要:實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)這本書(shū)是目前點(diǎn)評(píng)推薦比較多的書(shū),其特色是案例小,好實(shí)踐代碼有場(chǎng)景,實(shí)用。想要學(xué)習(xí)多線程的朋友,這本書(shū)是我大力推薦的,我的個(gè)人博客里面二十多篇的多線程博文都是基于此書(shū),并且在這本書(shū)的基礎(chǔ)上進(jìn)行提煉和總結(jié)而寫(xiě)出來(lái)的。 學(xué)習(xí)的最好途徑就是看書(shū),這是我自己學(xué)習(xí)并且小有了一定的積累之后的第一體會(huì)。個(gè)人認(rèn)為看書(shū)有兩點(diǎn)好處:showImg(/img/bVr5S5); 1.能出版出...
摘要:發(fā)布的對(duì)象內(nèi)部狀態(tài)可能會(huì)破壞封裝性,使程序難以維持不變性條件。不變性線程安全性是不可變對(duì)象的固有屬性之一。可變對(duì)象必須通過(guò)安全方式來(lái)發(fā)布,并且必須是線程安全的或者有某個(gè)鎖保護(hù)起來(lái)。 線程的優(yōu)缺點(diǎn) 線程是系統(tǒng)調(diào)度的基本單位。線程如果使用得當(dāng),可以有效地降低程序的開(kāi)發(fā)和維護(hù)等成本,同時(shí)提升復(fù)雜應(yīng)用程序的性能。多線程程序可以通過(guò)提高處理器資源的利用率來(lái)提升系統(tǒng)的吞吐率。與此同時(shí),在線程的使用...
摘要:所以接下來(lái),我們需要簡(jiǎn)單的介紹下多線程中的并發(fā)通信模型。比如中,以及各種鎖機(jī)制,均為了解決線程間公共狀態(tài)的串行訪問(wèn)問(wèn)題。 并發(fā)的學(xué)習(xí)門(mén)檻較高,相較單純的羅列并發(fā)編程 API 的枯燥被動(dòng)學(xué)習(xí)方式,本系列文章試圖用一個(gè)簡(jiǎn)單的栗子,一步步結(jié)合并發(fā)編程的相關(guān)知識(shí)分析舊有實(shí)現(xiàn)的不足,再實(shí)現(xiàn)邏輯進(jìn)行分析改進(jìn),試圖展示例子背后的并發(fā)工具與實(shí)現(xiàn)原理。 本文是本系列的第一篇文章,提出了一個(gè)簡(jiǎn)單的業(yè)務(wù)場(chǎng)景...
閱讀 1367·2021-09-10 10:51
閱讀 2834·2019-08-30 15:54
閱讀 3375·2019-08-29 17:11
閱讀 935·2019-08-29 16:44
閱讀 1396·2019-08-29 13:47
閱讀 1094·2019-08-29 13:47
閱讀 1493·2019-08-29 12:23
閱讀 1048·2019-08-28 18:18