Java:volatile 关键字的一点理解
2024-10-19 04:23:48
背景
学了六年C#,一直没有使用过 volatile,对多线程编程也是偶尔才会使用,这次学习 Java 又遇到了 volatile,准备稍微深入的了解一下。
volatile 的作用?
几乎所有支持这个关键字的语言给出的解释都一样:阻止编译器对字段访问和赋值的优化,直接从字段所在的空间取值(可能是值,也可能是引用),而非引入寄存器等优化措施(跟编译器的实现有关)。
使用 volatile 后对,字段的访问(this.field)和字段的赋值(this.filed = xxx)就是原子操作了,在多线程环境下,不需要使用 synchronized 进行访问,否则的话必须使用 synchronized 进行访问。
何时使用 volatile?
根据上文,我们很容易总结出一个规律:方法中只对字段就行了访问或赋值,volatile 和 synchronized可以结合使用,如下例:
public class Program {
static Object locked = new Object();
static volatile int count; public static void main(String[] args) {
// TODO Auto-generated method stub } static int getCount() {
return count;
} static void resetCount() {
count = 1;
} static void increaseCount() {
synchronized (locked) {
count++;
}
}
}
备注
本文没有深入到编译后的字节码级别进行探讨(也有可能是影响JIT),所以不一定对,有深入了解的朋友,还请留言批评。
最新文章
- Jquery学习笔记 --ajax删除用户,使用了js原生ajax
- css3动画第一式--简单翻滚
- eclipse中去掉Js/javsscript报错信息
- android 提高进程优先级 拍照永不崩溃(闪退)
- trigger,triggerhandler模拟事件
- Asp.Net Mvc5新特性
- $(this) 和 this
- uva 10905 Children's Game (排序)
- cocoapod的安装与使用
- ehCache浅谈(转)
- APlayer组件自制播放器
- 如何用 Git 合并两个库,并保留提交历史
- AVFoundation自定义拍照
- Dynamics CRM项目实例之九:CRM 2015的产品中的捆绑销售
- [SDOI2017]天才黑客[最短路、前缀优化建图]
- day44前端开发1之html基础
- 浅析 Bigtable 和 LevelDB 的实现
- copy代码的时候,如何去掉代码前边的编号
- 在win10下使用docker快速搭建ruby开发环境
- Vivado中xilinx_courdic IP核(求exp指数函数)使用