java多线程——原子性、可见性、顺序性
原子性
即一个或多个操作要么不执行,要么就全部执行完毕,不会被其他因素打断。类似于数据库的事务。
因此可以通过锁、synchronized来确保。volatile是无法保证复合操作的原子性。
可见性
当多个线程共享一个变量时,若其中一个线程改变变量的值,其他线程立即就能够看到,即为可见性。
Java提供了volatile(易变的)关键字来保证可见性。
有序性
即程序执行的顺序按照代码的先后顺序执行。
主要受到happens-before原则(先行发生原则)影响。
happens-before原则(先行发生原则)
- 程序次序规则:前一行代码优先于后一行代码执行;
- 锁定规则:前一个unlock操作优先于后一个unlock操作执行;
- 易变(volatile)变量规则:对于一个volatile变量写操作优先于读操作;
- 传递规则:A操作优先于B操作,B操作优先于C操作,则可推出A操作优先于C操作。