1.如何解决ArrayList线程不安全问题呢?
- 1.用Vector代替ArrayList
- 2.用Collections.synchronized(new ArrayList<>())
List<Object> arrayList = Collections.synchronizedList(new ArrayList<>());
- 3.CopyOnWriteArrayList
CopyOnWriteArrayList<BuildingBlockWithName> arrayList = new CopyOnWriteArrayList<>();
2.如何解决HashSet线程不安全问题呢?
- 1.使用Collections.synchronizedSet、
Set<BuildingBlockWithName> set = Collections.synchronizedSet(new HashSet<>());
- 2.使用CopyOnWriteArraySet(CopyOnWriteArraySet的底层还是使用的是CopyOnWriteArrayList)
CopyOnWriteArraySet<BuildingBlockWithName> set = new CopyOnWriteArraySet<>();
3.如何解决HashMap线程不安全问题呢?
- 1.Collections.synchronizedMap
Map<String, BuildingBlockWithName> map2 = Collections.synchronizedMap(new HashMap<>());
- 2.ConcurrentHashMap
ConcurrentHashMap<String, BuildingBlockWithName> set3 = new ConcurrentHashMap<>();
4.ConcurrentHashMap原理
ConcurrentHashMap,它内部细分了若干个小的 HashMap,称之为段(Segment)。 默认情况下一个 ConcurrentHashMap 被进一步细分为 16 个段,既就是锁的并发度。如果需要在 ConcurrentHashMap 中添加一个新的表项,并不是将整个 HashMap 加锁,而是首先根据 hashcode 得到该表项应该存放在哪个段中,然后对该段加锁,并完成 put 操作。在多线程环境中,如果多个线程同时进行put操作,只要被加入的表项不存放在同一个段中,则线程间可以做到真正的并行。