java volatile可见性的例子
2014-05-10 00:00
288 查看
摘要: 一直想用代码验证一下使用volatile和不适用volatile对变量可见性的影响,google找到的几个代码示例似乎都不太严密,于是写了一个,不知道是否也不严密,大家帮忙看看,如果有好的验证代码也请提供一下
一直想用代码验证一下使用volatile和不适用volatile对变量可见性的影响,google找到的几个代码示例似乎都不太严密,于是写了一个,不知道是否也不严密,大家帮忙看看,如果有好的验证代码也请提供一下。
先给一个不使用volatile关键字,导致变量不可见的例子
输出结果为:
exceptionCount:6542138604
可以看到exceptionCount大于0,说明线程1对变量i,j的修改对线程2不可见。
如果给i,j加上volatile关键字,则线程1对变量i,j的修改对线程2可见,下面给出代码:
输出结果为:
exceptionCount:0
从结果可以看出,线程1对变量i,j的修改对线程2可见。
一直想用代码验证一下使用volatile和不适用volatile对变量可见性的影响,google找到的几个代码示例似乎都不太严密,于是写了一个,不知道是否也不严密,大家帮忙看看,如果有好的验证代码也请提供一下。
先给一个不使用volatile关键字,导致变量不可见的例子
public class VolatileTest { private int i = 0; private int j = 0; public long exceptionCount = 0; //线程1调用这个方法 public void f1() { for(int k = 0; k < Integer.MAX_VALUE; k++) { i = k; j = i; } } //线程2调用这个方法 public void f2() { while (true) { //如果线程1对i,j的修改都是可见的,就不会出现j>i的情况了,一旦出现这种情况就能说明线程1对i,j的修改不可见 if(j > i) { exceptionCount++; } } } public static void main(String[] args) { final VolatileTest volatileTest = new VolatileTest(); //线程1 new Thread(new Runnable() { @Override public void run() { volatileTest.f1(); } }).start(); //线程2 new Thread(new Runnable() { @Override public void run() { volatileTest.f2(); } }).start(); try { Thread.sleep(5000); } catch (InterruptedException e) { } System.out.println("exceptionCount:" + volatileTest.exceptionCount); } }
输出结果为:
exceptionCount:6542138604
可以看到exceptionCount大于0,说明线程1对变量i,j的修改对线程2不可见。
如果给i,j加上volatile关键字,则线程1对变量i,j的修改对线程2可见,下面给出代码:
public class VolatileTest { private volatile int i = 0; private volatile int j = 0; public long exceptionCount = 0; public void f1() { for(int k = 0; k < Integer.MAX_VALUE; k++) { i = k; j = i; } } public void f2() { while (true) { if(j > i) { exceptionCount++; } } } public static void main(String[] args) { final VolatileTest volatileTest = new VolatileTest(); new Thread(new Runnable() { @Override public void run() { volatileTest.f1(); } }).start(); new Thread(new Runnable() { @Override public void run() { volatileTest.f2(); } }).start(); try { Thread.sleep(5000); } catch (InterruptedException e) { } System.out.println("exceptionCount:" + volatileTest.exceptionCount); } }
输出结果为:
exceptionCount:0
从结果可以看出,线程1对变量i,j的修改对线程2可见。
相关文章推荐
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量(r)
- java多线程 -- volatile 关键字 内存 可见性
- Java并发:volatile内存可见性和指令重排
- Java多线程之内存可见性——volatile
- 一个具体的例子学习Java volatile关键字
- Java并发:volatile内存可见性和指令重排
- Java并发_volatile实现可见性但不保证原子性
- Java多线程之内存可见性——synchronized与volatile比较
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- Java并发:volatile内存可见性和指令重排
- Java关键字volatile,原子性,变量可见性
- Java并发:volatile内存可见性和指令重排
- JAVA 多线程随笔 (一) 可见性和volatile关键字
- Java并发:volatile内存可见性和指令重排
- Java并发:volatile内存可见性和指令重排
- Java之多线程内存可见性_3(synchronized和volatile比较)
- Java并行(3):可见性重访之锁、Volatile与原子变量
- 变量可见性和volatile, this逃逸, 不可变对象, 以及安全公开--Java Concurrency In Practice C03读书笔记
- Java学习笔记--Volatile关键字和内存可见性