`

Java中volatile关键字的效果

阅读更多
之前在问答频道回答的一道题。问答频道没有收录到博客的功能,自己整理收藏一下。

http://www.iteye.com/problems/1737

使用volatile和不使用volatile的区别在于JVM内存主存和线程工作内存的同步之上。volatile保证变量在线程工作内存和主存之间一致。以下是示例程序,成员变量boolValue用volatile修饰会导致程序很快退出:
package linyumin.test.thread;   
/**  
 *   
 * @author llade  
 *  
 */  
public class VolatileObjectTest {   
  
    /**   
     * 成员变量boolValue使用volatile和不使用volatile会有明显区别的。  
     * 本程序需要多试几次,就能知道两者之间的区别的。  
     * @param args  
     */  
    public static void main(String[] args) {   
        final VolatileObjectTest volObj=new VolatileObjectTest();   
        Thread t1=new Thread(){   
            public void run(){   
                System.out.println("t1 start");   
                for(;;){   
                        volObj.waitToExit();   
                }   
            }   
        };   
        t1.start();   
        Thread t2=new Thread(){   
            public void run(){   
                System.out.println("t2 start");   
                for(;;){   
                    volObj.swap();   
                }   
            }   
        };   
        t2.start();   
    }   
  
    boolean boolValue;//加上volatile 修饰的是时候,程序会很快退出,因为volatile 保证各个线程工作内存的变量值和主存一致。所以boolValue == !boolValue就成为了可能。   
  
    public void waitToExit() {   
        if(boolValue == !boolValue)System.exit(0);//非原子操作,理论上应该很快会被打断。实际不是,因为此时的boolValue在线程自己内部的工作内存的拷贝,因为它不会强制和主存区域同步,线程2修改了boolValue很少有机会传递到线程一的工作内存中。所以照成了假的“原子现象”。   
    }   
       
    public void swap() {//不断反复修改boolValue,以期打断线程t1.   
        boolValue = !boolValue;   
    }   
  
}  
分享到:
评论
2 楼 moringchencg 2014-09-12  
你这个实验不严谨!!!
1 楼 youfengkai 2011-02-10  
boolValue == !boolValue

相关推荐

    java volatile 关键字实战

    java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...

    Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析

    Java线程:volatile关键字

    主要讲述java线程volatile关键字

    一文精通Java中的volatile关键字

    volatile是java中的关键词之一,这篇文章主要给大家介绍了关于Java中volatile关键字的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    java volatile 关键字 学习

    java volatile 关键字 学习

    Java中volatile关键字实现原理

    本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,对Java中volatile关键字实现原理感兴趣的朋友一起通过本文学习吧

    解析java中volatile关键字

    主要为大家解析了java中volatile关键字,经常有人把volatile关键字和synchronized或者lock混淆,本文就为大家好好区分,感兴趣的小伙伴们可以参考一下

    Java中volatile关键字的作用与用法详解

    volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。这篇文章主要介绍了Java中volatile关键字的作用与用法详解的相关资料,需要的朋友可以参考下

    深入理解Java中的volatile关键字(总结篇)

    volatile这个关键字,不仅仅在Java语言中有,在很多语言中都有的,而且其用法和语义也都是不尽相同的。这篇文章主要介绍了Java中的volatile关键字,需要的朋友可以参考下

    多方面解读Java中的volatile关键字.rar

    多方面解读Java中的volatile关键字.rar

    Java中volatile关键字的总结.docx

    volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上...

    java里的volatile关键字详解

    java里的volatile关键字详解

    java语言的volatile教程,java语言的volatile关键字是干什么用的

    java语言的volatile教程,java语言的volatile关键字到底怎么用

    Java并发volatile关键字.docx

    synchronized是阻塞式同步,在线程...这个实际对普通变量没有规定的,而针对volatile修饰的变量给Java虚拟机特殊的约定,线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读,从而保证数据的可见性。

    java里的volatile关键字详解.pdf

    java里的volatile关键字详解.pdf

    谈谈Java中Volatile关键字的理解

    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果,本文给大家介绍java中volatile关键字,需要的朋友参考下

    Java中volatile关键字的含义

    在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候可以万事大吉。  Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 ...

    Java中Volatile关键字详解及代码示例

    主要介绍了Java中Volatile关键字详解及代码示例,分为两个部分,第一部分介绍了Volatile关键字的基本概念等内容,第二部分分享了实例代码,具有一定参考价值,需要的朋友可以了解下。

    Java——volatile关键字详解

    volatile是比synchronized关键字更轻量级的同步机制,访问volatile变量时不会执行加锁操作,因此不会使执行线程阻塞。 volatile保证可见性和禁止指令重排序,底层是通过“内存屏障”来实现,但不保证原子性。 写入...

    深入了解Java中Volatile关键字

    主要介绍了Java中Volatile关键字的相关知识,文章讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

Global site tag (gtag.js) - Google Analytics