クライアントはロックをかけます.同じロックを使うように注意してください.

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 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によって与えられる.