正如Java_author提到的,客户端锁定是否违反同步策略的封装?
客户端锁定需要守着使用一些对象X与锁定的客户端代码,X使用来保护它自己的状态。
在下面的代码即对象X是list
。以上说的是,使用锁所拥有的ListHelper
类型的对象来同步putIfAbsent()
,是一个错误的锁。
package compositeobjects;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ListHelper<E> {
private List<E> list =
Collections.synchronizedList(new ArrayList<E>());
public boolean putIfAbsent(E x) {
synchronized(list){
boolean absent = !list.contains(x);
if(absent) {
list.add(x);
}
return absent;
}
}
}
但是,Java的作者说,
客户端锁定有很多共同的类扩展,他们俩夫妇的派生类的基础实施的行为类。正如扩展违反实现封装[EJ条款14]一样,客户端锁定违反了对同步策略的封装。
我的理解是,Collections.synchronizedList()
返回的嵌套类实例,也使用了list
所拥有的锁对象。
为什么ListHelper
客户端锁定(与list
)的使用,违反了同步策略的封装?
因为'synchronizedList'使用自己作为监视器,而目前情况恰好如此。如果此实现更改,您的代码将无法正常工作。 –
@AndyTurner明白了。通过'ArrayList'监控模式是个好主意。你建议吗? – overexchange
您知道您的实用程序类可以被['synchronizedSet'](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedSet(java.util。组))? –