美文网首页
Collections同步化容器

Collections同步化容器

作者: 远o_O | 来源:发表于2017-07-20 15:52 被阅读19次
    • 我们可以这样将线程不安全的容器转化为线程安全的。
    Collections.synchronizedMap(new HashMap<>());
    Collections.synchronizedList(new LinkedList<>());
    Collections.synchronizedSet(new TreeSet<>());
    
    • 为什么会这么神奇,看看synchronizedMap源码:
        public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
            return new SynchronizedMap<>(m);
        }
    
        /**
         * @serial include
         */
        private static class SynchronizedMap<K,V>
            implements Map<K,V>, Serializable {
            private static final long serialVersionUID = 1978198479659022715L;
    
            private final Map<K,V> m;     // Backing Map
            final Object      mutex;        // Object on which to synchronize
    
            SynchronizedMap(Map<K,V> m) {
                if (m==null)
                    throw new NullPointerException();
                this.m = m;
                mutex = this;
            }
    
            SynchronizedMap(Map<K,V> m, Object mutex) {
                this.m = m;
                this.mutex = mutex;
            }
    
            public int size() {
                synchronized (mutex) {return m.size();}
            }
    

    应该很清楚了:

    • 1.所有的map操作,都委托给传进去的map。
    • 2.同时对map操作进行加锁,即只有获得mutex这个对象的锁的线程,才可以访问,这样就保证了线程安全。

    由于采用的是加锁实现线程安全,因此相对于CAS,copy on write等无锁实现,效率低下,从而也降低了吞吐率。

    相关文章

      网友评论

          本文标题:Collections同步化容器

          本文链接:https://www.haomeiwen.com/subject/qhxjkxtx.html