参考
转换代码
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
工具包下面的对应类,性能更好。 - 例如
HashMap
可以使用ConcurrentHashMap
HashSet
可以使用CopyOnWriteArraySet
ArrayList
可以使用CopyOnWriteArrayList