为 NavigableMap 编写同步线程安全包装器

pol*_*nts 2 java collections synchronization design-patterns wrapper

java.util.Collections目前提供以下实用方法来synchronized为各种集合接口创建包装器:

类似地,它也有6个unmodifiedXXX重载。

这里明显遗漏的是 的实用方法NavigableMap<K,V>。确实如此extends SortedMap,但 、 和 也是如此SortedSet extends Set,并且Set extends Collection和都有Collections专用的实用方法。大概是一个有用的抽象,否则它一开始就不会存在,但还没有实用的方法。SortedSetSetNavigableMap

所以问题是:

  • 是否有特定原因Collections不提供实用方法NavigableMap
  • 您将如何编写自己的synchronized包装器NavigableMap
    • 浏览OpenJDK 版本的源代码Collections.java似乎表明这只是一个“机械”过程
      • 一般来说,您是否可以synchronized像这样添加线程安全功能?
      • 如果是这样一个机械过程,可以自动化吗?(Eclipse插件等)
      • 这段代码重复是否必要,或者是否可以通过不同的 OOP 设计模式来避免?

Bal*_*usC 5

这是一个疏忽。Java 8 中添加了修复程序。

乔什写道:

“他们绝对属于那里。他们的缺席是无意的。
我们应该尽快把他们放进去。”

我同意,尽管我们没有一个工程师期待编写(和测试)所有这些令人头脑麻木的转发方法。发布日期 : 2006-08-21 00:50:41.0


如果您还没有使用 Java 8,您可能会考虑劫持该java.util包,因为您想扩展static class SynchronizedSortedMap<K, V>声明为私有的包。否则就会有大量的代码复制粘贴。这是一个开始:

package java.util;

import java.util.Collections.SynchronizedSortedMap;

public class NewCollections {

    public static <K, V> NavigableMap<K, V> synchronizedNavigableMap(NavigableMap<K, V> m) {
        return new SynchronizedNavigableMap<K, V>(m);
    }

    static class SynchronizedNavigableMap<K, V> extends SynchronizedSortedMap<K, V> implements NavigableMap<K, V> {
        private final NavigableMap<K, V> sm;

        SynchronizedNavigableMap(NavigableMap<K, V> m) {
            super(m);
            sm = m;
        }

        SynchronizedNavigableMap(NavigableMap<K, V> m, Object mutex) {
            super(m, mutex);
            sm = m;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

让 IDE 自动生成 未实现的方法NavigableMap并以与以前相同的方式对其进行编码SynchronizedSortedMap。这是一个例子:

        @Override
        public K ceilingKey(K key) {
            synchronized (mutex) { return sm.ceilingKey(key); }
        }
Run Code Online (Sandbox Code Playgroud)

请注意,返回的方法例如您也Set需要将其包装起来。SynchronizedSet再次,请参阅SynchronizedMapSynchronizedSortedMap来源以获得见解:)

我不认为它是(能够)一个机械过程,因为它涉及很多因素。