欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中volatile关键字的效果 博客分类: Java基础 Java多线程thread工作JVM 

程序员文章站 2024-03-25 08:57:28
...
之前在问答频道回答的一道题。问答频道没有收录到博客的功能,自己整理收藏一下。

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;   
    }   
  
}