一定要你明白Java中的volatile
今天Tony来和大家聊聊Java中关键字volatile。
字节码
首先volatile int a = 3;
和int a = 3;
,
加不加volatile关键字,最终生成的字节码都一样的。有兴趣的同学可以试试看看字节码是否一样。
英文解释
Adding volatile to the field does not change Java bytecode that reads or writes the field. It only changes the interpretation of the program by JVM or JIT compilation output if needed. It also influences optimizations.
中文理解
内存屏障的概念是针对CPU架构级别的,需要在JIT编译器生成机器码的时候才能看到。
java内存
讲讲java内存,在java内存中所有的变量都存在与主内存中,每个线程都有自己的工作内存。每个线程中的所用到的变量都是一个副本,都是从主内存中拷贝过来的。
在多线程的场景下,处于性能的考虑。每个线程处理变量的时候都会从主内存复制到当前的cpu缓存中,因为cpu缓存处理速度是相当的快。随之带来的问题就是一个变量被多个线程在不同的cpu中访问。
不同线程之间不能直接访问对方线程间的变量。他们之间的数据都传递都是通过主内存来实现的。
volatile关键字
java中用volatile 修饰的关键字将会标记在“主内存”中,每次对volatile变量的读取都是从计算机的主内存读取,不是从cpu缓存中读取。可以这么理解每次我都是取主内存里的数据。
同样对volatile变量的写入同时会写入到主内存和cpu缓存中。
不用volatile
举个例子,当线程T1对变量a进行写操作此刻a=1,如果此刻没有使用
volatile 关键字,那么此刻线程T2中的a还是等于0。
这个时候线程T2并不能读取到线程T1写的a=1,此刻线程T1并没有将a=1回写到主内存中去。
线程的可见性,就是上面说的这种情况。1个线程对变量进行操作并不会通知到另一个线程。
使用volatile内存可见性
public class VolatileObject {
public volatile int a = 0;
}
上面代码当线程T1修改a的值,另一个线程T2读取a的自值,
在上面给出的场景中,一个线程(T1)修改计数器,另一个线程(T2)读取计数器(但从不修改),声明计数器变量volatile足以保证T2对计数器变量的写入可见。
指令重排序
1、重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。
2、调制执行语句的顺序,重排序是为了更好的提升性能。
3、重排序保证在单线程下不会改变执行结果,但在多线程下可能会改变执行结果。
举个例子
原文地址:https://www.cnblogs.com/tonyY/p/12158856.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 42图揭秘,「后端技术学些啥」
- R-ggTimeSeries | ggplot2: 热力日历图
- R-wordcloud: 词云图
- 直播APP源码是如何实现音视频同步的
- 动态规划算法练习(5)--medium
- phpstudy漏洞分析原因到修复
- 哈?命令注入外带数据的姿势还可以这么骚?
- 记一次曲折的RCE挖掘
- pytest文档49-命令行参数--tb的使用
- pytest文档50-命令行参数--durations统计用例运行时间
- pytest文档51-内置fixture之cache使用
- pytest文档53-命令行实时输出错误信息(pytest-instafail)
- pytest文档52-命令行参数--setup-show查看fixture的执行过程
- pytest文档54-Hooks函数terminal打印测试结果(pytest_report_teststatus)
- SAS-免费的描述性统计程序自动化创建