2010-05-15 49 views
2

java.util.Collections目前提供用于创建各种集合接口​​包装下面的实用方法:编写同步线程安全的包装器的NavigableMap

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

这里明显的遗漏是NavigableMap<K,V>的实用方法。确实,extends SortedMapSortedSet extends SetSet extends CollectionCollections对于SortedSetSet都有专门的实用方法。据推测NavigableMap是一个有用的抽象,否则它不会在那里,但它没有实用的方法。

所以问题是:

  • 有为什么Collections没有为NavigableMap提供实用方法具体原因是什么?
  • 你会如何编写自己的​​包装NavigableMap
    • source code for OpenJDK version of Collections.java扫视似乎表明,这仅仅是一个“机械”过程
      • 这是真的,一般你可以添加​​线程safetiness功能也是这样吗?
      • 如果是这样的机械过程,它可以自动化吗? (Eclipse插件等)
      • 此代码重复是否必要,或者是否可以通过不同的OOP设计模式避免?

回答

4

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

乔什写道:

“他们绝对属于有他们的缺席是无意
我们要尽快把他们尽可能。”

我同意,即使我们没有一位工程师正在期待 来编写(和测试)所有那些令人头脑麻木的转发方法。 发布日期: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来源获取洞察:)

我不认为它是(可以是)机械过程,因为它涉及很多因素。

+0

Woot!正如它为“为什么?”所说的那样具有权威性。不过,我现在无法接受这个答案,因为它错过了“如何?”。你愿意对此发表评论吗?这仍然是我的问题的重要组成部分。编写和测试这些“令人头脑麻木的转发方法”有多困难?它可以不是半自动的吗?等 – polygenelubricants 2010-05-16 05:08:26

+0

我只是从'Collections'源文件中复制'静态类SynchronizedMap'和'静态类SynchronizedSortedMap',添加你自己的'SynchronizedNavigableMap',它扩展了SynchronizedSortedMap''并且以与两个复制类相同的方式装饰缺少的方法确实。这将是很多的代码,它已经晚了:) – BalusC 2010-05-16 05:14:11

+0

它是这样一个机械和“头脑麻木”的过程!人们会认为它应该是可自动化的! – polygenelubricants 2010-05-16 05:46:59

1

有为什么收藏不适合的NavigableMap提供实用方法具体原因是什么?

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

  • 监督,
  • 的“几乎没有人会使用它”的情况下,或
  • 也许有,是不是很明显一些技术难度。

但是在任何一种情况下,原因并不重要。该实用程序方法不存在,因此无论您是找到第三方库还是自己实施它。

难道一般情况下,您可以添加像这样的同步线程安全性功能吗?

总体上没有。您需要了解您正在绑定的类的语义,以确保线程安全,以确定包装是否足够。

如果是这样的机械过程,它可以自动化吗? (Eclipse插件等)

不...看上面。

这段代码是否需要重复,或者它是否可以通过不同的OOP设计模式避免?

我不认为这是可以避免的。这种事情通常需要对元编程的语言支持,或者对于编写包装类的具体情况。设计模式不适合你。

+0

只是为了澄清我自己的理解,不过,这是装饰图案'Collections'确实有关于包装类?例如'synchronizedSet'返回一个'Set',它可以“装饰”另一个具有威胁安全特性的'Set',但是它本身不会自己做任何'Set'类的工作? – polygenelubricants 2010-05-15 15:02:07

+0

@polygenelubricants我会说这是对的。 – 2010-05-16 00:37:35

2

这是真的,一般你可以添加 同步线程safetiness功能 这样吗?

我相信这是真的。线程安全的定义是(IMO)

如果从多线程调用它时,如果没有不正确的行为(在单线程中使用时不会发生这种行为)可以对其所有方法发生,则该类是线程安全的没有任何外部同步。

现在,下面的代码将确保“Something”永远不会被多个线程调用,对吧?因此,我认为不会因多线程调用而出现不良行为;它从来没有从多个线程调用!

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

public class MakeSomethingThreadSafe implements Something { 
    private final Object lock = new Object(); 
    private final Something subject; 

    public MakeSomethingThreadSafe(Something subject){ 
     this.subject = subject; 
    } 

    public void someMethod(){ 
     synchronized(lock){ 
      subject.someMethod(); 
     } 
    } 
} 

或者我错过了什么?

为了使后完成:

有为什么 收藏不适合的NavigableMap提供实用 方法,具体原因是什么?

我同意斯蒂芬。

你会如何编写自己的 NavigableMap的同步包装?

像我的示例代码..

这是真的,一般你可以添加 同步线程safetiness功能 这样吗?如果是这样的机械 过程,它可以自动化吗? (Eclipse 插件等)

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

  1. 实现接口
  2. 让2场;一个用于互斥,一个用于主题。
  3. 创建一个构造函数来注入主题。
  4. 使每个方法同步并委托给主题。

这是代码重复必要,或者 难道是避免由 不同的面向对象的设计模式?

喜欢SetMap等?对我来说,这听起来不太可能以“正常”的方式解决。