江的福的小本本之集合类线程不安全

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!~

发布了51 篇原创文章 · 获赞 11 · 访问量 1756

猜你喜欢

转载自blog.csdn.net/weixin_45276914/article/details/105530699