并发线程的三个重要概念
1 原子性
对基本数据类型的变量读取和赋值是保证了原子性的,要么都成功,要么都失败,这些操作不可中断。
比如 i = 10
a = 10 原子性
b=a 不满足 read a , 赋值 b
c++ 不满足 read c ; add , 赋值 c
c=c+1 不满足 read c;add; 赋值 c
2 可见性
可以使用volatile 关键字保证可见性
什么是可见性,两个线程分别从主内存中获取数据,缓存到自己缓存区中,一个线程对数据进行改变了,另一个线程立马可以感应到,这叫做可见性,可以使用volatile 关键字进行修饰所操作的数据。
3 有序性
happens-before relationship 原则
1 代码的执行顺序,编写的前的发生在编写后面的
2 unlock 必须发生在lock后
3 volatile 修饰的变量,对一个变量的写操作先于读操作
3 传递规则,操作A先于B,B先于C,那么A肯定先于C
4 线程启动规则,start先于run
5 线程中断规则,interrupt 这个动作,必须发生在捕获该动作之前。
6 对象销毁规则,初始化发生在finalize之前
7 线程中介规则,所有的操作都发生在线程死亡之前
Volatile 关键字
1 保证重排序的是不会把指令放到屏障的前面,也不会把前面的放在后面。
2 强制对缓存的修改操作立刻写入主内存。
3 如果是写操作,它会导致其他Cpu中的缓存失效。
一旦一个贡献变量被volatile修饰,具备两层含义
1 保证了不同线程间的可见性
2 禁止对其进行重排序,也就是保证了有序性
3 并未保证原子性