クライアントはロックをかけます.同じロックを使うように注意してください.
1075 ワード
クライアントはロックをかけます.同じロックを使うように注意してください.
誤ったやり方:
class ListHelper{
public List=Collection s.synchronized List(new ArayList);
public
synchronized bootlen putIfAbsent(E x)
book absent=!list.com ntains(x);
if{absent}
list.add(x)
)
return absent;
)
)
このロックはListHelperに加えて、ListHelper補助類であり、他のlistに対する操作は異なるロックを使用しているので、putIfAbsentは他の操作に対して原子ではない.
正しいやり方:
class ListHelper{
public List=Collection s.synchronized List(new ArayList);
public bootlean putIfAbsent(E x)
synchronized(list){
book absent=!list.com ntains(x);
if{absent}
list.add(x)
)
return absent;
)
)
)
もっといい方法は使うことです.
既存のクラスに結合して原子を追加します.
誤ったやり方:
class ListHelper{
public List=Collection s.synchronized List(new ArayList);
public
synchronized bootlen putIfAbsent(E x)
book absent=!list.com ntains(x);
if{absent}
list.add(x)
)
return absent;
)
)
このロックはListHelperに加えて、ListHelper補助類であり、他のlistに対する操作は異なるロックを使用しているので、putIfAbsentは他の操作に対して原子ではない.
正しいやり方:
class ListHelper{
public List=Collection s.synchronized List(new ArayList);
public bootlean putIfAbsent(E x)
synchronized(list){
book absent=!list.com ntains(x);
if{absent}
list.add(x)
)
return absent;
)
)
)
もっといい方法は使うことです.
既存のクラスに結合して原子を追加します.
class ImprovedList implements List {
private final List list;
public ImprovedList(List list) {
this.list = list;
}
public synchronized boolean putIfAbsent(E x) {
boolean absent = !list.contains(x);
if(absent) {
list.add(x);
}
return absent;
}
クライアントはこのオブジェクトを直接使用しなくなり、結合はImprovedListによって与えられる.