通过本片文章,你可以了解到:
java 是基于那些具体的实现来构建java并发体系的
前提
上一篇我们聊到了并发编程遇到的核心问题(线程间的通信与同步),以及java的解决方案(内存共享)。下面我们具体的聊下java实际实现中依赖于那些工具
.
一些概念
- 锁
- 因为线程间的通信与同步,我们需要解决的是多线程访问某个资源(在一定时间内只能有部分线程可以访问操作). 我们可以简单的理解为
锁
,谁获取到了锁,谁就可以操作。
- 因为线程间的通信与同步,我们需要解决的是多线程访问某个资源(在一定时间内只能有部分线程可以访问操作). 我们可以简单的理解为
- 线程不安全
- 多线程情况下,对某个公共资源的多次操作会有不同的值(有别于理论上的结果),这就叫线程不安全。反之则称为线程安全。
实际实现的工具
原理层次
- synchronized
- volatile
- final
- CAS
基于原理实现的工具类
- java 并发包(JUC)
java并发包(JUC)
实际操作中,我们用到最多的就是JUC了,理解整个java高并发体系的核心也是在于JUC。
先来一张图镇楼
相关模块(从底部向上)
volatile 变量读写/CAS (底层实现)
- 这两个能够保证线程对于同一个变量进行修改 一定是对最新的变量值修改或者是读取。保证数据的正确性。实现基于共享内存模型线程间通讯
- java 中volatile简单理解: 如果一个变量被volatile修饰,那么对于任意线程对于该线程的读写都可以被其他线程
看到
。 - CAS 无锁对数据进行修改
AQS/非阻塞数据结构/原子变量类(底层接口的抽象封装)
Lock/同步锁/阻塞队列/并发容器/Executor (对AQS等进行更高一层的封装)
1
2本质上其实都是基于volatile以及CAS的类volatile的内存读写语义,
保证程序的正确顺序来进行线程间的通信与数据同步。
参考
《java并发编程的艺术》方腾飞 魏鹏 程晓明 著