1 java如何保证原子性,可见性
原子性
java中有规范
- 对基本数据类型的变量的读取和赋值是保证了原子性的,要么都成功,要么都失败,这些操作是不可被中断的
假设在一个线程中对i赋值10(i=10),首先时会把cache中i变为10,然后会刷会主内存中
eg:
- a=10 —> 原子性的
- b=a —> 不是原子性的,分为两步,每一步是原子性,合起来就不是原子性的
- read a
- assign b
- c++ —> 不是原子性的,分了三步
- read c
- add
- assign to c
可见性
使用关键字volatile,会保证这个变量更改之后会立即刷回主存,使这个变量在缓存中失效,每个线程都会去
主存中读取这个变量
有序性(happen-before关系)
java允许编译器,对指令进行重排序,只要保证最终结果一致性即可,在单线程这是没有问题的。
2 happen-before关系
- 单线程的下代码的执行顺序:编写在前面的发生在编写在后面的
- unlock必须发送在lock之后
- 关键字volatile修饰的变量,对一个变量的写操作先于该变量的读操作。
- 传递规则:操作A先于操作B,操作B先于操作C,那么A肯定先于C
- 线程的启动规则:start方法肯定先于线程执行的操作
- 线程的中断规则:线程的interrupt动作,必须发生在捕获该动作之前
- 对象的销毁规则:一个对象的初始化必须发生在销毁之前
- 线程的终结规则:对线程的所有操作必须发生在线程死亡之前