为什么Sun不使用synchronized(this)而不是mutex = this
然后使用synchronized(互斥)?
做他们做的事情,我看不出任何好处?我错过了什么吗?
static class SynchronizedCollection<E> implements Collection<E>, Serializable {
private static final long serialVersionUID = 3053995032091335093L;
final Collection<E> c; // Backing Collection
final Object mutex; // Object on which to synchronize
SynchronizedCollection(Collection<E> c) {
if (c==null)
throw new NullPointerException();
this.c = c;
mutex = this;
}
SynchronizedCollection(Collection<E> c, Object mutex) {
this.c = c;
this.mutex = mutex;
}
public int size() {
synchronized (mutex) {return c.size();}
}
public boolean isEmpty() {
synchronized (mutex) {return c.isEmpty();}
}
答案 0 :(得分:1)
这允许Collection的客户端通过第二个构造函数在一个互斥锁上同步多个集合。
答案 1 :(得分:1)
向客户提供传递他自己的互斥对象的规定给了一个灵活的世界。客户端可以在任意锁定方案中涉及同步集合,涵盖适合其用例的尽可能多的代码。如果this
是唯一选项,那么锁粒度将固定为集合上的一个方法调用,否则会强制客户端将集合用作其互斥锁,从而破坏整体设计。
答案 2 :(得分:0)
我认为,当您想要使用单个互斥锁同步收集方法以及实现的方法时,这会让您更安全。 也许你可以只用一个互斥锁在许多这样的集合之间同步!
答案 3 :(得分:0)
例如Collections.synchronizedMap(map).values()
,Collection
互斥map
上应该Collection
同步。还有许多其他实用程序需要在其他对象上同步{{1}}。