各线程安全容器都是怎么实现线程安全的?

首先什么是线程安全?

原子性

这一点,跟数据库事务的原子性概念差不多,即一个操作(有可能包含有多个子操作)要么全部执行(生效),要么全部都不执行(都不生效)。

一致性(可见性)

可见性是指,当多个线程并发访问共享变量时,一个线程对共享变量的修改,其它线程能够立即看到。可见性问题是好多人忽略或者理解错误的一点。

顺序性

顺序性指的是,程序执行的顺序按照代码的先后顺序执行。

ConcurrentXXX系列

用ConcurrentHashMap作为例子来讲。
1.8之后,ConcurrentHashMap的数据结构是Node数组+链表/红黑树。

写安全

如果Node结点是空的,直接CAS写入
如果Node结点不是空的,则synchronized对结点加锁,添加链表结点or红黑树结点

读安全

使用Volatile关键字修饰。Volatile关键字可以保证变量的可见性。ps:volatile只能保证读安全,写是不安全的

CopyOnWriteXXX系列

写写阻塞,其他不阻塞

写安全

顾名思义,写的时候是直接把变量复制一份出来,在复制出来的这一份上面改,改完了把原来的指针指向复制的这一份。

读安全

天然线程安全。读取操作没有任何同步控制和锁操作,理由就是内部数组 array 不会发生修改,只会被另外一个 array 替换,因此可以保证数据安全

读写锁ReentrantReadWriteLock

读读不互斥、读写互斥、写读互斥、写写互斥
每次只能有一个写线程,但是同时可以有多个线程并发地读数据
ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有(共享),写锁是独占的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值