Java:volatile 关键字的一点理解
2015-11-04 16:22
429 查看
Java:volatile 关键字的一点理解
背景
学了六年C#,一直没有使用过 volatile,对多线程编程也是偶尔才会使用,这次学习 Java 又遇到了 volatile,准备稍微深入的了解一下。
volatile 的作用?
几乎所有支持这个关键字的语言给出的解释都一样:阻止编译器对字段访问和赋值的优化,直接从字段所在的空间取值(可能是值,也可能是引用),而非引入寄存器等优化措施(跟编译器的实现有关)。使用 volatile 后对,字段的访问(this.field)和字段的赋值(this.filed = xxx)就是原子操作了,在多线程环境下,不需要使用 synchronized 进行访问,否则的话必须使用 synchronized 进行访问。
何时使用 volatile?
根据上文,我们很容易总结出一个规律:方法中只对字段就行了访问或赋值,volatile 和 synchronized可以结合使用,如下例:1 public class Program { 2 static Object locked = new Object(); 3 static volatile int count; 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 8 9 } 10 11 static int getCount() { 12 return count; 13 } 14 15 static void resetCount() { 16 count = 1; 17 } 18 19 static void increaseCount() { 20 synchronized (locked) { 21 count++; 22 } 23 } 24 }
备注
本文没有深入到编译后的字节码级别进行探讨(也有可能是影响JIT),所以不一定对,有深入了解的朋友,还请留言批评。
相关文章推荐
- Java内部类问题
- java.lang.IllegalStateException: commit already called
- myeclipse下web项目转maven,并保留WEB.XML
- java clone()
- 探究JAVA父类子类静态代码块、静态变量、构造方法的执行顺序
- Struts2+Spring3+Hibernate框架技术
- Java 执行过程详解 - JVM 生命周期
- Java导出Excel三表头
- springmvc 返回汉字乱码
- 两种Eclipse部署动态web项目方法
- JDK安装与配置详细图文教程
- spring mvc 返回页面json数据一种做法
- 传智播客javase总结
- Java 并发编程实践---可重入锁
- Eclipse常用快捷键
- Java简单的客户端与服务器的建立与通信
- Java语法糖---伪泛型
- 【已解决】Eclipse for Android 出现Could not find SDK folder....问题解决
- Java图形用户界面——Swing概述
- 在java 中 cmd.startsWith("") 是什么意思