集合类线程不安全
1、 Arraylist的线程不安全
众所周知,Arraylist是线程不安全的,它的add方法并没有加synchronized,那我们先来体验一下它的不安全。
现象: java.util.ConcurrentModificationException
那我们该如何解决这种不安全问题呢?
什么? 你说加锁?
亲,咱们来看看
可以看到,Vector实现了List接口,再看add方法,可以看到synchronized.
但是vector是jdk1.0出现的,而Arraylist是,如果1.2,如果我们回答vector,是不是代表Arraylist就没有存在的必要?
vector可以保证一致性,但会使得并发性急剧下降。
除new Vector之外,再列举两种方法,
第一种是Collections.synchronizedList
List list = Collections.synchronizedList(new ArrayList<>());
而第二种就要说到写时复制(CopyOnWrite)了
撸源码:
关键的volatile看到了?在高并发的环境下使用volatile至关重要。
写时加锁先复制,修改之后才解锁。
读时不需要加锁,读写分离容器异。
2、Set的线程不安全
这里就不证明了,直接列举解决方法。
1、 Set set = Collections.synchronizedSet(new HashSet<>());
2、CopyOnWriteArraySet
Set set =new CopyOnWriteArraySet<>();
思想还是那个思想。不多说
插一句题外话,知道hashset 的底层是什么吗?
答对了,就是hashmap
但是为什么hashset 的add方法只需要一个参数呢?
PRESENT是固定的所以hashset 的add只需要一个参数
3、Map的线程不安全
1、 Map map =Collections.synchronizedMap(new HashMap<>());
2、Map map1 =new ConcurrentHashMap<>();
over!~