关于volatile的测试。。。

问题描述

public class TestThread {private static boolean flag = false;public static void main(String[] args) {new Thread() {int i = 0;public void run() {long tm = System.currentTimeMillis();while (!flag) {i++;}System.out.println(System.currentTimeMillis() - tm);}}.start();new Thread() {public void run() {try {Thread.sleep(2000);flag = true;} catch (InterruptedException e) {e.printStackTrace();}}}.start();}} 首先是这样,这样线程永远不会退出,因为线程读到的是旧值,如果给flag加上volatile则会退出。但加了一句打印的语句就奇怪了:public class TestThread {private static boolean flag = false;public static void main(String[] args) {new Thread() {int i = 0;public void run() {long tm = System.currentTimeMillis();while (!flag) {i++;System.out.println(i);}System.out.println(System.currentTimeMillis() - tm);}}.start();new Thread() {public void run() {try {Thread.sleep(2000);flag = true;} catch (InterruptedException e) {e.printStackTrace();}}}.start();}} 如果这样子,即使不加上volatile,线程也会退出,求解。。我的JDK版本是1.6.0_37。

解决方案

类似的问题我之前问过R大http://hllvm.group.iteye.com/group/topic/34932http://hllvm.group.iteye.com/group/topic/34975

时间: 2024-10-25 23:11:30

关于volatile的测试。。。的相关文章

volatile关键字的说明以及测试

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统.硬件或者其它线程等.遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问. 使用该关键字的例子如下: int volatile nVint; 当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据.而且读取的数据立刻被保存. 例如: volatile int i=10; in

nanoTime对volatile 测试的一种写法

今天脑筋有点搭牢,想了半天才看出为什么以下两段代码效果是相同的... 第一种好处是可以直接批量复制黏贴system.out,  不用改什么东西   private static long i;  private volatile static long vt;  private static final int TEST_SIZE = 10000000; long time = System.nanoTime(); for (int n = 0; n < TEST_SIZE; n++) vt =

使用Volatile变量还是原子变量

volatile变量 在Java语言中,volatile变量提供了一种轻量级的同步机制,volatile变量用来确保将变量的更新操作通知到其它线程,volatile变量不会被缓存到寄存器或者对其它处理器不可见的地方,所以在读取volatile变量时总会返回最新写入的值,volatile变量通常用来表示某个状态标识. 原子变量: 原子变量是"更强大的volatile"变量,从实现来看,每个原子变量类的value属性都是一个volatile变量,所以volatile变量的特性原子变量也有.

并行编程之多线程共享非volatile变量,会不会可能导致线程while死循环

背景 大家都知道线程之间共享变量要用volatile关键字.但是,如果不用volatile来标识,会不会导致线程死循环?比如下面的伪代码: static int flag = -1; void thread1(){ while(flag > 0){ //wait or do something } } void thread2(){ //do something flag = -1; } 线程1,线程2同时运行,线程2退出之后,线程1会不会有可能因为缓存等原因,一直死循环? 真实的世界 第一个坑

C语言的副作用测试实例及序列点

测试例子1: #include int main(void) {  int a = 5;  printf("%d, %d, %d\n", (a++) , (a++) , (a++));  printf("a = %d\n", a);  return 0;} 编译执行: $ gcc foo.c$ ./a.out 7, 6, 5a = 8 测试例子2: #include int main(void) {  int a = 5;  printf("s = %d\

volatile限定符{C}

PS: ...Newbie love coding-  Linux_c一站式编程(volatile限定符介绍) linux_c的volatile限定符 现在探讨一下编译器优化会对生成的指令产生什么影响,在此基础上介绍C语言的volatile限定符.看下面的例子: 我们用recv和send这两个全局变量来模拟设备寄存器.假设某种平台采用内存映射I/O,串口发送寄存器和串口接收寄存器位于固定的内存地址,而recv和send这两个全局变量也有固定的内存地址,所以在这个例子中把它们假想成串口接收寄存器和

银行取款[多线程]{使用volatile修饰共享变量,但此场景并不保证线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题. 此处用多线程实现,同时取款的模拟实现,使用volatile修饰共享变量,但此场景并不保证线程同步,查看取款安全隐患问题,代码如下: 我学习地址(Thanks for auther): Java 理论与实践: 正确使用 Volatile 变量 java中volatile关键字的含义 ----------------------------------------------------------

volatile是否能保证数组中元素的可见性?

在javaeye有位朋友问了我一个非常好的问题. 问题 一个线程向volatile的数组中设置值,而另一个线程向volatile的数组中读取. 比如seg.setValue(2),随后另一个线程调用seg.getValue(2),前一个线程设置的值对读取的线程是可见的吗? 我看书上说volatile的数组只针对数组的引用具有volatile的语义,而不是它的元素. ConcurrentHashMap中也有这样的代码,我很疑惑,希望得到你的解答,谢谢. 查看源代码 打印帮助 01 public c

java中volatile关键字

v一.前言 JMM提供了volatile变量定义.final.synchronized块来保证可见性. 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值.volatile很容易被误用,用来进行原子性操作.写了几个测试的例子,大家可以试一试. 关于JMM,可参考:http://www.cnblogs.com/hujunzheng/p/5118256.html v二.主程序 public class Main{ public static void main(Str