JMM(Java内存模型)主要有三大特性:原子性,可见性和有序性,今天咱们就来了解一下这三大特性。编程
原子性
- 原子性是指一个操做是不能够中断的。即便是多个线程一块儿执行的状况下也同样,这个操做操做一旦开始就不会被其余因素锁影响(除了JVM退出等等的状况)。
- 须要注意的是,什么操做才能算是原子操做呢?像:int i = 1;这类语句就能够称为原子语句。那么i++ 能不能算是一条原子操做的语句呢?这乍一看像是一条语句,但实际它是两条语句:第一步先将i进行加1的操做,第二步再将新的值赋值与i,因此i++不是一条原子操做的语句。
可见性
- 可见性指的是在并发编程的时候,一个线程修改了某一个共享变量的值,其它线程是否能当即察觉到这个变量值发生了改变。(在串行的状况下,可见性问题是不存在的,由于在串行程序改变值之后,后面读取的都是这个修改后的值)
有序性
- 在串行编程的状况下,代码通常都是从上往下依次执行的。可是在并发编程的状况下,可能进行指令重排的状况,写在前面的代码会在后面执行。
- 既然可能发生指令重排的状况,那就是有些状况下不会发生重排,不会发生重排涉及到一个原则,Happen-Before原则:
- 程序顺序原则:一个线程内保证语义的串行性。
- volatile原则:volatile变量的写,先发生于读,这就保证了volatile的可见性
- 解锁(unlock)发生在随后的解锁(lock)前
- 传递性:A先于B,B先于C,那么A先于C
- 线程的start先于它的一切操做
- 线程的操做先于线程的终结
- 线程的终端先于被中断的代码
- 对象的改造函数执行、结束先于finalize()前