《java多线程编程核心技术》读书笔记2.2:volatile关键词

第二章 对象及变量的并发访问

在我们讲解volatile这个关键词时,我们首先要,了解一下变量在内存中工作的过程:


java程序在运行的过程当中有主内存和线程内存之分:程序在启动的时候会将所有的变量加载到主内存当中,线程在运行时有一下工作要做:

  1. read和load阶段:线程从主存复制变量到当前线程工作内存
  2. use和asign阶段:执行代码,改变共享变量的值;
  3. store和write阶段:用工作内存的数据刷新主存对应变量的值
      在多线程的环境下,use和asign是多次出现的,但这一操作并不是原子性的,也就是在read和load之后,如果主存count变量发生修改之后,线程工作内存的值由于已经加载,不会产生对应的变化,也就是私有内存和公有内存中的变量不同步,所以计算出来的结果会和预期不一样,也就出现了非线程安全的问题。
       对于用volatile修饰的变量,JVM虚拟机只是保证从主存加载到线程工作内存的值是最新的。volatile关键字解决的是变量读时的可见性问题,但是无法保证原子性,对于多个线程访问同一个实例变量还是需要加锁同步的。


volatile的作用就是每次在使用变量的时候,总是将主内存中的变量值和线程内存的变量值进行比较,如果不同则加载主内存中的值。

java特种兵里面说:volatile的作用限制指令重排:

  1. 如果是一条对volatile变量进行赋值的操作的代码,那么该代码前面的任何代码不能与这个赋值操作交换顺序。 如果这个操作后有普通变量的读写操作,则是可以与他交换顺序的。在这个动作之前的指令相互之间还是可以重排的。,只是不能排序到该动作的后面。
  2. 如果是一条读取volatile的代码,则正好相反,在它后面的操作不允许与他交换顺序,之后的多个动作依然可以重排,在他之前的普通变量的操作动作也可以与它交换顺序。
 


















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章