2

为什么 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();}
        }
4

4 回答 4

1

为客户提供传递他自己的互斥对象的规定提供了一个灵活的世界。客户端可以在任意锁定方案中涉及同步集合,覆盖尽可能多的代码以适合他的用例。如果this是唯一的选择,那么锁定粒度将被固定为仅对集合的一个方法调用,或者它会强制客户端将集合用作他的互斥体,从而破坏整体设计。

于 2013-10-12T09:57:50.447 回答
1

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

于 2013-10-12T09:13:37.820 回答
0

我认为,当您想要在集合方法以及使用单个互斥锁实现的方法中进行同步时,这会给您带来更多的安全性。也许你可以只用一个互斥锁在许多这样的集合之间同步!

于 2013-10-12T08:04:55.300 回答
0

举个例子Collections.synchronizedMap(map).values(),它应该是互斥体Collection上的同步。map还有许多其他实用程序需要Collection在其他对象上同步。

于 2013-10-12T16:31:37.547 回答