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