Java并发基础(3)------Java内存模型基础

JMM(Java内存模型)主要有三大特性:原子性,可见性有序性,今天咱们就来了解一下这三大特性。编程

原子性

  1. 原子性是指一个操做是不能够中断的。即便是多个线程一块儿执行的状况下也同样,这个操做操做一旦开始就不会被其余因素锁影响(除了JVM退出等等的状况)。
  2. 须要注意的是,什么操做才能算是原子操做呢?像:int i = 1;这类语句就能够称为原子语句。那么i++ 能不能算是一条原子操做的语句呢?这乍一看像是一条语句,但实际它是两条语句:第一步先将i进行加1的操做,第二步再将新的值赋值与i,因此i++不是一条原子操做的语句。

可见性

  1. 可见性指的是在并发编程的时候,一个线程修改了某一个共享变量的值,其它线程是否能当即察觉到这个变量值发生了改变。(在串行的状况下,可见性问题是不存在的,由于在串行程序改变值之后,后面读取的都是这个修改后的值)

有序性

  1. 在串行编程的状况下,代码通常都是从上往下依次执行的。可是在并发编程的状况下,可能进行指令重排的状况,写在前面的代码会在后面执行。
  2. 既然可能发生指令重排的状况,那就是有些状况下不会发生重排,不会发生重排涉及到一个原则,Happen-Before原则:
  • 程序顺序原则:一个线程内保证语义的串行性。
  • volatile原则:volatile变量的写,先发生于读,这就保证了volatile的可见性
  • 解锁(unlock)发生在随后的解锁(lock)前
  • 传递性:A先于B,B先于C,那么A先于C
  • 线程的start先于它的一切操做
  • 线程的操做先于线程的终结
  • 线程的终端先于被中断的代码
  • 对象的改造函数执行、结束先于finalize()前