Java 为什么SynchronizedCollection将此分配给互斥锁?

Java 为什么SynchronizedCollection将此分配给互斥锁?,java,collections,synchronization,Java,Collections,Synchronization,为什么Sun没有使用synchronized(this)而不是mutex=this然后使用synchronized(mutex)? 我看不出他们这样做有什么好处?我错过什么了吗 static class SynchronizedCollection<E> implements Collection<E>, Serializable { private static final long serialVersionUID = 3053995032091335

为什么Sun没有使用synchronized(this)而不是
mutex=this
然后使用synchronized(mutex)?
我看不出他们这样做有什么好处?我错过什么了吗

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();}
        }
静态类SynchronizedCollection实现可序列化的集合{
私有静态最终长serialVersionUID=3053995032091335093L;
最终集合c;//支持集合
最终对象互斥体;//要同步的对象
SynchronizedCollection(集合c){
如果(c==null)
抛出新的NullPointerException();
这个.c=c;
互斥=这个;
}
SynchronizedCollection(集合c,对象互斥){
这个.c=c;
this.mutex=mutex;
}
公共整数大小(){
已同步(互斥){返回c.size();}
}
公共布尔值为空(){
已同步(互斥){return c.isEmpty();}
}

我认为,当您希望在收集方法上以及在使用单个互斥体的实现方法中进行同步时,这会给您带来更大的安全性。
您可以只使用一个互斥对象在多个这样的集合之间进行同步!

这允许集合的客户端通过第二个构造函数在单个互斥对象上同步多个集合。

为客户端传递自己的互斥对象提供了灵活性。客户端可以使用同步的集合在任意锁定方案中执行操作,根据其用例覆盖尽可能多的代码。如果
是唯一选项,则锁定粒度将固定为集合上的一个方法调用,或者它将强制客户端将集合用作其互斥锁,从而中断总体设计。

Collec为例tions.synchronizedMap(map).values()
,它应该是
映射
互斥体上的
集合
同步。还有许多其他实用程序需要在其他对象上同步
集合

尽量不要问“Sun为什么这样做?”,因为只有Sun的开发人员才能回答这个问题。另外,您将如何验证您得到的答案是否正确?因此,这个问题可能没有任何“正确”的答案。