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

时间:2013-10-12 07:56:43

标签: java collections synchronization

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

例如Collections.synchronizedMap(map).values()Collection互斥map上应该Collection同步。还有许多其他实用程序需要在其他对象上同步{{1}}。