《java多线程编程核心技术》读书笔记2.2:volatile关键词
来源:互联网 发布:职场鸡汤 知乎 编辑:程序博客网 时间:2024/06/06 01:14
第二章 对象及变量的并发访问
在我们讲解volatile这个关键词时,我们首先要,了解一下变量在内存中工作的过程:
java程序在运行的过程当中有主内存和线程内存之分:程序在启动的时候会将所有的变量加载到主内存当中,线程在运行时有一下工作要做:
- read和load阶段:线程从主存复制变量到当前线程工作内存
- use和asign阶段:执行代码,改变共享变量的值;
- store和write阶段:用工作内存的数据刷新主存对应变量的值
在多线程的环境下,use和asign是多次出现的,但这一操作并不是原子性的,也就是在read和load之后,如果主存count变量发生修改之后,线程工作内存的值由于已经加载,不会产生对应的变化,也就是私有内存和公有内存中的变量不同步,所以计算出来的结果会和预期不一样,也就出现了非线程安全的问题。
对于用volatile修饰的变量,JVM虚拟机只是保证从主存加载到线程工作内存的值是最新的。volatile关键字解决的是变量读时的可见性问题,但是无法保证原子性,对于多个线程访问同一个实例变量还是需要加锁同步的。
volatile的作用就是每次在使用变量的时候,总是将主内存中的变量值和线程内存的变量值进行比较,如果不同则加载主内存中的值。
java特种兵里面说:volatile的作用限制指令重排:
- 如果是一条对volatile变量进行赋值的操作的代码,那么该代码前面的任何代码不能与这个赋值操作交换顺序。 如果这个操作后有普通变量的读写操作,则是可以与他交换顺序的。在这个动作之前的指令相互之间还是可以重排的。,只是不能排序到该动作的后面。
- 如果是一条读取volatile的代码,则正好相反,在它后面的操作不允许与他交换顺序,之后的多个动作依然可以重排,在他之前的普通变量的操作动作也可以与它交换顺序。
0 0
- 《java多线程编程核心技术》读书笔记2.2:volatile关键词
- java多线程编程核心技术-volatile关键字
- 《java多线程编程核心技术》读书笔记1
- 《java多线程编程核心技术》读书笔记2.1
- 《java 多线程编程核心技术》读书笔记一
- 《java 多线程编程核心技术》读书笔记二
- 《java 多线程编程核心技术》读书笔记三
- 《java 多线程编程核心技术》读书笔记四
- 《java 多线程编程核心技术》读书笔记五
- 《java 多线程编程核心技术》读书笔记六
- 读书笔记——Java多线程编程核心技术
- 多线程编程核心技术读书笔记(一):Java多线程技能
- java多线程 Java核心技术 读书笔记
- 多线程编程核心技术读书笔记(二):对象及变量的并发访问(volatile关键字)
- 《java多线程编程核心技术》读书笔记3:线程间的通信
- 《java多线程编程核心技术》读书笔记4:Lock的使用
- 《java多线程编程核心技术》读书笔记6:线程中的异常处理
- 《java 多线程编程核心技术》读书笔记三(补充内容)
- android 页面跳转代码
- php 处理APP emoji表情包 IOS表情包 Mysql保存手机表情
- 前言
- 【leetcode】393. UTF-8 Validation【M】
- 数据结构之KMP算法解析
- 《java多线程编程核心技术》读书笔记2.2:volatile关键词
- tomcat学习笔记
- 汇编语言(b)--存储器
- java 插入排序
- 效率
- Android-day03-RadioButton
- Spark学习(一)--RDD操作
- 009-取有效地址指令LEA
- 老生常谈javascript的5中继承