Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为NavigableMap编写同步线程安全包装器_Java_Design Patterns_Collections_Synchronization_Wrapper - Fatal编程技术网

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

Java 为NavigableMap编写同步线程安全包装器,java,design-patterns,collections,synchronization,wrapper,Java,Design Patterns,Collections,Synchronization,Wrapper,当前提供以下实用程序方法,用于为各种集合接口创建同步的包装器: 类似地,它还有6个未修改的xxx重载 这里最明显的遗漏是实用方法。的确,扩展了SortedMap,但是SortedSet扩展了Set,集合扩展了Collection,集合有专门的实用方法用于SortedSet和Set。大概NavigableMap是一个有用的抽象,否则它一开始就不会存在,但是没有实用的方法 因此,问题是: 集合没有为导航地图提供实用方法,有什么具体原因吗 如何为NavigableMap编写自己的sy

当前提供以下实用程序方法,用于为各种集合接口创建
同步的
包装器:

类似地,它还有6个未修改的xxx重载

这里最明显的遗漏是实用方法。的确,
扩展了SortedMap
,但是
SortedSet扩展了Set
集合扩展了Collection
集合有专门的实用方法用于
SortedSet
Set
。大概
NavigableMap
是一个有用的抽象,否则它一开始就不会存在,但是没有实用的方法

因此,问题是:

  • 集合
    没有为
    导航地图
    提供实用方法,有什么具体原因吗
  • 如何为
    NavigableMap
    编写自己的
    synchronized
    包装器?
    • 瞥一眼这个过程似乎表明这只是一个“机械”过程
      • 一般来说,您是否可以像这样添加
        synchronized
        threadsafenties功能
      • 如果是这样一个机械过程,它能自动化吗?(Eclipse插件等)
      • 这种代码重复是必要的,还是可以通过不同的OOP设计模式来避免
集合不为NavigableMap提供实用方法有什么具体原因吗

我想不出具体的原因。要么是

  • 一个疏忽
  • “几乎没有人会使用它”的案例,或
  • 也许有一些技术上的困难并不明显
但无论哪种情况,原因都无关紧要。实用程序方法不存在,因此您要么找到第三方库,要么自己实现它

一般来说,您可以像这样添加同步线程安全特性,这是真的吗

通常不会。您需要理解要使线程安全的类的语义,以确定包装器是否足够

如果是这样一个机械过程,它能自动化吗?(Eclipse插件等)

不。。。见上文

这种代码重复是必要的,还是可以通过不同的OOP设计模式来避免

我认为这是无法避免的。这种事情通常需要对元编程或编写包装器类的特定情况提供语言支持。设计模式不会为你做那种事

一般来说,您可以添加 同步线程安全功能 像这样

我相信这是真的。螺纹安全的定义是(IMO)

如果在没有任何外部同步的情况下从多个线程调用类时,该类的所有方法都不会发生错误行为(从单个线程使用时不会发生),则该类是线程安全的

现在,下面的代码将确保“某物”永远不会被多个线程调用,对吗?因此,我相信不会因为被多个线程调用而出现不良行为;它从未从多个线程调用过

这可能也是EJB背后的想法。无状态EJB从不由多个线程调用(由容器强制)。这就是为什么EJB规范可以说“您不必担心线程安全”

还是我遗漏了什么

要使文章完整,请执行以下操作:

有没有具体的原因 集合不提供实用程序 导航地图的方法

我同意斯蒂芬的观点

你会怎么写你自己的 NavigableMap的同步包装器

就像我的示例代码

一般来说,您可以添加 同步线程安全功能 这样地?如果是这样一个机械的 过程,它能自动化吗?(日食) 插件等)

是的,我认为它可以很容易地自动化

  • 实现接口
  • 制作2个字段;一个用于互斥,一个用于主题
  • 创建一个构造函数来注入主题
  • 使每个方法同步并委托给主题
  • 是否需要重复此代码,或者 这是否可以通过一种方式避免呢 不同的面向对象设计模式

    Set
    Map
    等?在我看来,用“正常”的方式解决这个问题是不可能的。

    这是一个疏忽

    乔希写道:

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

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

    不过这需要一段时间

    <强>更新< /强>:对于手动实现它,您可以考虑劫持<代码> java .UTIL/COD>包,因为您想扩展<代码>静态类同步SCORTEDMAP ,这是声明的包私有的。否则会有大量的代码复制粘贴。这是一个开始:

    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;
            }
    
        }
    }
    
    请注意,返回例如
    Set
    的方法也需要将其包装在
    SynchronizedSet
    中。再次,请参阅
    SynchronizedMap
    SynchronizedSortedMap
    源以获取详细信息:)


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

    仅供参考,Java 8现在有了它:

    private NavigableMap=Collections.synchronizedNavigableMap(…)


    只是为了澄清我自己的理解,这是
    Collections
    对包装类所做的装饰模式吗?e、 g.
    synchronizedSet
    返回一个
    集合
    ,该集合使用威胁安全功能“装饰”另一个
    集合
    ,但其本身不执行任何
    
    
    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;
            }
    
        }
    }
    
            @Override
            public K ceilingKey(K key) {
                synchronized (mutex) { return sm.ceilingKey(key); }
            }