Collections类中,类SynchronizedMap具有两个构造函数。一个仅使用map实例,而另一个使用mapmutex

    SynchronizedMap(Map<K,V> m) {
        this.m = Objects.requireNonNull(m);
        mutex = this;
    }

    SynchronizedMap(Map<K,V> m, Object mutex) {
        this.m = m;
        this.mutex = mutex;
    }


但是,SynchronizedMap类是私有的静态类,并且是使用提供的包装方法访问它的唯一方法:

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
    return new SynchronizedMap<>(m);
}


this link可以理解,第二个构造函数使用mutex以外的用户提供的this的想法。现在,由于wrapper方法是获取SynchronizedMap实例(仅包含一个地图对象)的唯一方法,所以第二个重载构造函数的用途是什么?

最佳答案

它用于例如在创建子图视图时扩展SynchronizedSortedMapSynchronizedMap中。

 public SortedMap<K,V> subMap(K fromKey, K toKey) {
            synchronized (mutex) {
                return new SynchronizedSortedMap<>(
                    sm.subMap(fromKey, toKey), mutex);
            }
        }


共享相同的互斥锁。

10-06 13:00