2 回答

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)不一致。

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 .......)
}
添加回答
舉報