Android开发经验谈Android开发

深入理解Java虚拟机(八)之Java内存模型

2018-06-26  本文已影响19人  AntDream

Java内存模型规定了所有的变量都存储在主内存,每个线程都有自己的工作内存,线程中的工作内存保存了被该线程使用到的变量的主内存的副本拷贝。线程对变量的所有操作都在工作内存中进行,不同的线程之间变量值的传递需要通过主内存来完成

volatile

可见性:当一个线程修改了变量的值,新值对于其他线程来说是立即得知的

需要注意的是volatile只保证可见性,不保证原子性。在不符合以下2条规则的运算场景中,volatile变量的运算在并发下一样是不安全的。

  • 运算结果并不依赖变量当前额值,或者能够确保只有单一的线程修改变量的值
  • 变量不需要与其它的状态量共同参与不变约束
  • 原子性:基本数据类型的访问读写都是具备原子性的,synchronized块之间的操作也具备原子性
  • 可见性:Java内存模型是通过在变量修改后将新的值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式实现可见性。除了volatile关键字,还有synchronized和final能够实现可见性
    有序性:Java中volatile和synchronized关键字可以保证线程之间操作的有序性
先行发生原则

先行发生原则:是Java内存模型中定义的2项操作之间的偏序关系,如果说操作A先行发生于操作B,其实就是说在发生操作B之前,操作A产生的影响能被操作B观察到

Java内存模型下的一些天然的先行发生关系:

Java线程

Java中的线程安全

Java语言中线程安全程度由强到弱可分为:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立

线程安全的实现方法

互斥同步:指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个(或是一些,使用信号量的时候)线程使用。

可重入代码:可以在代码执行的任何时刻中断,转而去执行另外一段代码,在控制权返回后原来的程序不会出现任何错误。所有的可重入的代码都是线程安全的。

上一篇下一篇

猜你喜欢

热点阅读