Volatile


volatile 是 Java 虚机提供的的同机制可以保性(存一致性协议有序性(禁止指令重排序,也就是通内存障来实现,但是不保原子性。

 

作用

 

volatile 作 用  保 证 变 量 对 所 有 线 程 的 可 见 性  禁 止 指 令 重 排  不 保 证 原 子 性

 

内存模型

Java***  Java***  Java***  工 作 内 存  工 作 内 存  工 作 内 存  Sava  Load  操 作  一 0  主 内 存

 

Happen Before

happens-before 原,是 JMM 中非常重要的一个原是判断数是否存在争、线程是否安全的主要依,依靠这个原,我可以解决在并发环境下个操作之是否存在冲突的所有问题JMM 定,个操作存在 happens-before 系并不一定要 A 操作先于B 操作行,要 A 操作的 B 操作可即可。

  • 程序序原一个线程内保证语义的串行性
  • volatile规则:volatile量的写操作,先生于操作了volatile量的可
  • 锁规则(unlock)必然生在后的加(lock)前
  • 传递性:A先于B,B先于C,那A必然先于C
  • 线程的start()方法先于一个
  • 线程的所有操作先于线程的终结(Thread.join())
  • 线程的中断(interrupt)先于被中断线程的代
  • 象的行、束先于finalize()方法

 

 

内存

内存障其也是一JVM指令,Java内存模型的重排规则会要求Java编译器在生成JVM指令时插入特定的内存障指令,过这内存障指令来禁止特定的指令重排序。

外内存具有一定的语义内存障之前的所有写操作都要回写到主内存,内存障之后的所有操作都能得内存障之前的所有写操作的最新果(实现了可性)。因此重排序,不把内存障之后的指令重排序到内存障之前。

 

 

见问题

 

法保原子性?

入内存障之前的操作并不是原子性的。多个线程可以修改,所以法保原子性。