【问题标题】:Why does SynchronizedCollection assign this to a mutex?为什么 SynchronizedCollection 将其分配给互斥锁?
【发布时间】:2013-10-12 07:56:42
【问题描述】:

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

【问题讨论】:

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

标签: java collections synchronization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-18
          • 2014-02-28
          • 1970-01-01
          • 2021-06-04
          • 1970-01-01
          • 2012-03-12
          相关资源
          最近更新 更多