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

151 阅读2分钟

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()前