引言
很久之前就想写volatile关键字,但是迟迟没有动笔,主要是volatile涉及到的东西有点多,讲不清楚倒还好,就怕反而把读者绕晕了,哈哈。
volatile关键字是为了保证内存可见性及有序性的,首先介绍并发编程中涉及到的3个问题:
并发编程规则
原子性
原子具有不可分割性,所谓原子性,指的是一个或多个操作,要么全部执行且执行过程不会被任何因素打断,要么就全部执行,其与事务的语义是一致的。
比如经典的转账问题:
小明给小强转账1000元,该操作分为2步:
- 小明的账户减少1000元;
- 小强的账户增加1000元。
如果上述操作是非原子的,假如步骤1执行成功,而步骤2则异常中断,此时就会造成小明平白无故丢失了1000元。
在Java中,主要通过synchronized关键字、Lock接口来实现多个操作的原子性。
可见性
所谓可见性,指的线程之间的可见性,一个线程修改的状态对另外的线程是可见的。
在Java中valatile、synchronized和final实现了可见性。
有序性
即程序执行的顺序按照代码的先后顺序执行。
int i = 0;
boolean flag = false;
i =1; // 语句1
flag = true; // 语句2
程序本来就是按照代码顺序来执行的呀&