Java 将线程不安全的集合转换为线程安全的集合

参考

转换代码

package thread;

import java.util.*;

/**
 * @Author 夏秋初
 * @Date 2022/3/1 15:36
 */
public class Test {
    public static void main(String[] args) {
        Map<String, Object> map = Collections.synchronizedMap(new HashMap(16));
        Set<String> set = Collections.synchronizedSet(new HashSet(16));
        List<String> list = Collections.synchronizedList(new ArrayList<>(10));
    }
}

线程安全的原因(HashMap为例)

  • 通过 Collections.synchronizedMap(new HashMap(16)) 执行后,返回一个 SynchronizedMap 对象,实现了 Map 接口,源码 Collections 2564 行为该对象的源码

  • get 与 put 方法都使用了 synchronized 代码块实现同步

        public V get(Object key) {
            synchronized (mutex) {return m.get(key);}
        }

        public V put(K key, V value) {
            synchronized (mutex) {return m.put(key, value);}
        }
  • 其中 final 常量 mutex 是该对象本身,可以查看 Collections 2571 行的构造函数
        SynchronizedMap(Map<K,V> m) {
            this.m = Objects.requireNonNull(m);
            mutex = this;
        }

建议

  • 建议使用 java.util.concurrent 工具包下面的对应类,性能更好。
  • 例如
    1. HashMap 可以使用 ConcurrentHashMap
    2. HashSet 可以使用 CopyOnWriteArraySet
    3. ArrayList 可以使用 CopyOnWriteArrayList
posted @ 2022-03-01 16:07  夏秋初  阅读(238)  评论(0编辑  收藏  举报