我指的是 JCP 4.4.2,它有以下示例代碼
@ThreadSafe
public class ImprovedList<T> implements List<T>{
private final List<T> list;
public ImprovedList(List<T> list){this.list=list;}
public synchronized boolean putIfAbsent(T x){
boolean contains = list.contains(x);
if(contains){
list.add(x);
}
return !contains;
}
@Override
public synchronized void clear(){list.clear();}
}
這本書說這個改進串列是執行緒安全的,但我有一個問題:
建構式“list”的輸入引數來自外部。所以,雖然putIfAbsent()是synchronizedon ImprovedList,但不能保證鎖是放在ImprovedList.list. 如果另一個執行緒正在更改/添加任何型別的 [T] 元素到 thislist中,ImprovedList.putIfAbsent我猜可能會導致未確定的狀態。
請幫助糾正我的理解。
uj5u.com熱心網友回復:
是的,但是如果你看這本書,他們會做出這樣的假設:
改進串列假設一旦一個串列被傳遞給它的建構式,客戶端將不會再次直接使用底層串列,只能通過改進串列訪問它
基于這個假設,代碼是執行緒安全的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491148.html
