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

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

> synchronizedCollection(Collection<T> c)
> synchronizedList(List<T> list)
> synchronizedMap(Map<K,V> m)
> synchronizedSet(Set<T> s)
> synchronizedSortedMap(SortedMap<K,V> m)
> synchronizedSortedSet(SortedSet<T> s)

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

明显的遗漏是NavigableMap<K,V>的实用程序方法.它的确扩展了SortedMap,但SortedSet扩展了Set,Set扩展了Collection,并且Collections具有用于SortedSet和Set的专用实用程序方法.大概是NavigableMap是一个有用的抽象,否则它本来就不会存在的,但是还没有实用的方法.

所以问题是:

>集合不提供NavigableMap的实用方法的特定原因吗?
>您将如何为NavigableMap编写自己的同步包装器?

>浏览source code for OpenJDK version of Collections.java似乎表明这只是一个“机械”过程

>是否可以添加像这样的同步线程安全性功能,这是真的吗?
>如果是这样的机械过程,可以自动化吗? (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包,因为您想扩展静态类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中.再次,请参阅SynchronizedMap和SynchronizedSortedMap源以获得见解:)

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

上一篇:JAVA 并发编程之十一:阻塞型同步Blocking Synchronization + 非阻塞型同步Non-blocking Synchronization


下一篇:Linux上的pthread条件变量,异常行为