java.util.Collections.SynchronizedList中方法的实现是在互斥锁上使用同步。鉴于在所有方法中,完整的方法体在同步块下,为什么不能将它写为同步方法?
基本上:
public boolean doSomething(Collection<?> coll) {
synchronized (mutex) {return c.doSomething(coll);}
}
VS
public synchronized boolean doSomething(Collection<?> coll) {
return c.doSomething(coll);
}
我没有扫描所有类,但可能是因为某些方法需要部分同步(即不是整个方法体),并且因为它们扩展了相同的基类(SynchronizedCollection),实现恰好是使用互斥锁进行更精细的控制。那是对的吗?或者,对于这种实施方式,还有其他原因,如性能吗?
答案 0 :(得分:2)
为什么不能将它写成同步方法?
有一个package-private factory method for SynchronizedList
和corresponding package-private constructor,它允许使用除列表本身之外的互斥锁构建列表。
您不能直接使用它,但java.util
包中会有使用它。
一个例子是SynchronizedList.subList
:
public List<E> subList(int fromIndex, int toIndex) {
synchronized (mutex) {
return new SynchronizedList<>(list.subList(fromIndex, toIndex),
mutex);
}
}
即。对子列表的访问在父列表上同步,而不是子列表。
另一个例子是Vector.subList
method:
public synchronized List<E> subList(int fromIndex, int toIndex) {
return Collections.synchronizedList(super.subList(fromIndex, toIndex),
this);
}
即。对子列表的访问在Vector
上同步,而不是子列表。