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

标签 java design-patterns collections synchronization wrapper

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

同理,也有6 unmodifiedXXX重载。

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

所以问题是:

  • 是否有具体原因 Collections不提供 NavigableMap 的实用方法?
  • 你会如何编写自己的synchronized NavigableMap 的包装?
    • 浏览 source code for OpenJDK version of Collections.java 似乎表明这只是一个“机械”过程
      • 一般情况下可以添加synchronized吗?像这样的线程安全功能吗?
      • 如果这是一个机械过程,可以自动化吗? (Eclipse插件等)
      • 此代码重复是否必要,或者可以通过不同的 OOP 设计模式来避免吗?

最佳答案

这是一个疏忽。 The fix is in progress .

Josh writes:

"They definitely belong there. Their absence is unintentional.
We should put them in as soon as possible."

I agree, even though none of us engineers are looking forward to writing (and testing) all those mind-numbing forwarding methods. Posted Date : 2006-08-21 00:50:41.0

不过这需要时间。

更新:对于手动实现,可以考虑劫持 java.util包,因为您想扩展 static class SynchronizedSortedMap<K, V>它被声明为包私有(private)。否则就会有大量的代码复制粘贴。这是一个开始:

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见解来源:)

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

关于java - 为 NavigableMap 编写同步线程安全包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2839267/

相关文章:

java - 在执行 org.codehaus.mojo :exec-maven-plugin:1. 6.0 :exec: java. lang.String 时无法转换为 org.codehaus.mojo.exec.Modulepath

java - 重新分配引用对象时对内存的影响

java - 如何在 viewpager fragment 中添加 fragment

web-services - SOAP Webservice 错误——设计实践

collections - 如何在特定索引中添加新项目?

java - 面试问题 - 在排序数组 X 中搜索索引 i 使得 X[i] = i

java - 确定要使用哪种设计模式?

c# - DRY ID一次性图案

java - 实现和集合

java - Java中Collections中的Collection.add()方法和Collection.addAll()方法有什么区别