Java volatile Java虚拟机提供的最轻量级同步机制
来源:互联网 发布:mac打开照片 编辑:程序博客网 时间:2024/05/22 17:00
看下面的代码:
package testForThread;/* * volatile变量自增运算测试 * * @author wangGang */public class VolatileTest {public static volatile int race = 0;public static void increace() {race = race + 1;}private static final int THREADS_COUNT = 20;public static void main(String[] args) {Thread[] threads = new Thread[THREADS_COUNT];for (int i = 0; i < THREADS_COUNT; i++) {threads[i] = new Thread(new Runnable() {@Overridepublic void run() {for (int j = 0; j < 10000; j++) {increace();}}});threads[i].start();}while (Thread.activeCount() > 1) {Thread.yield();}System.out.println(race);}}
理论上应该输出20000,但是结果却不是这样 每次运行也会有不同的结果
每个线程在运行的时候都有自己的工作内存,区别于主内存。它两的关系类似于cache和内存的关系。单个线程修改变量的值的时候只会修改自己工作内存中的值,修改完毕之后会通过一系列的操作同步到主内存中。普通的变量只能保证其在主内存中的一致性,不同线程的工作内存中的值可能是不同的。但是如果变量被volatile关键字修饰即可保证在多线程并行时各个线程可以看到一致的值。但是上面的代码显示却不是这样的,这是为什么?
答案是java的运算并非原子操作 :
<span style="font-size:18px;">race = race + 1;</span>
问题出在这行代码上。
个人笔记,可能有误。
0 0
- Java volatile Java虚拟机提供的最轻量级同步机制
- Java轻量级锁的机制
- java的同步机制
- Java的同步机制
- java volatile 同步
- 测试java.swing包提供的轻量级组件的例子
- java的volatile机制(前篇)
- Java同步机制的应用
- java的同步机制synchronize
- Java多线程的同步机制
- Java多线程的同步机制
- java的同步机制synchronized
- java多线程的同步机制
- JAVA基本的同步机制
- java中提供了哪两种多态的机制
- java提供的一些并发机制
- Java虚拟机-线程同步
- Java虚拟机13:互斥同步、锁优化及synchronized和volatile
- 面向对象高级——instanceof关键字的使用以及抽象类与接口的应用
- IDEA中以最简单方式实现实现Jrebel热部署
- JAVA如何抛出异常
- tar 解压缩命令详解
- 存储过程的优缺点
- Java volatile Java虚拟机提供的最轻量级同步机制
- JNI 常用的JNI操作Demo 良心作品
- 解决PLSQL记录被另一个用户锁住的问题
- JDBC连接mysql数据库
- Spark Streaming kafka 实现数据零丢失的几种方式
- jmeter学习笔记(Threads)
- 权限管理框架实现(2)--Struts中ValueStack使用
- Cocos2d-JS 精灵的性能优化
- Viewpager+fragment数据更新问题解析