小编典典

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

java

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

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

明显的遗漏是这里的实用方法NavigableMap<K,V>。的确如此extends SortedMap,但SortedSet extends Setand Set extends Collection和and
确实Collections有专用于SortedSetand的实用程序方法Set。大概NavigableMap是一个有用的抽象,否则它本来就不会存在的,但是还没有实用的方法。

所以问题是:

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

阅读 225

收藏
2020-11-26

共1个答案

小编典典

这是一个疏忽。该修复程序正在进行中

乔希写道:

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

我同意,即使我们当中没有一个工程师期望编写(和测试)所有这些令人麻木的转发方法。发表日期:2006-08-21 00:50:41.0

不过要花一点时间。

更新 :关于手动实现它,您可以考虑劫持该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;
        }

    }
}

让IDE自动生成未实现的方法,NavigableMap并以相同的方式对它们进行编码SynchronizedSortedMap。这是一个示例:

        @Override
        public K ceilingKey(K key) {
            synchronized (mutex) { return sm.ceilingKey(key); }
        }

请注意,例如返回的方法也Set需要将其包装SynchronizedSet。再次,请参阅SynchronizedMapSynchronizedSortedMap参考资料以获取见解:)

我不希望它是机械过程,因为它涉及很多因素。

2020-11-26