iteye_19432 2008-07-21 11:36
浏览 346
已采纳

加不加Volatile看不出有什么效果啊

[code="java"]import java.util.concurrent.atomic.AtomicInteger;

public class VolatilePattern1 extends Thread{

volatile boolean shutdownRequested;
private AtomicInteger count = new AtomicInteger();

public void shutdown() {
    shutdownRequested = true;
}

public void run() { 
    System.out.println("Thread:" + Thread.currentThread().getName()+" started.");
while (!shutdownRequested) { 
    System.out.println("working ..."+count);
    count.getAndIncrement();
    try {
                Thread.sleep(50);
            } catch(InterruptedException ie) {
                ie.printStackTrace();           
            }
}
}

public static void main(String[] args) {
    System.out.println("Thread:" + Thread.currentThread().getName()+" started.");
    VolatilePattern1 vp = new VolatilePattern1();
    vp.start();
    try {
        Thread.sleep(2000);
    } catch(InterruptedException ie) {
        ie.printStackTrace();           
    } finally {
        vp.shutdown();
    }
}

}[/code]

  • 写回答

3条回答 默认 最新

  • llade163 2008-07-21 22:44
    关注

    区别在于JVM内存主存和线程工作内存的同步之上。volatile保证变量在线程工作内存和主存之间一致。以下是示例程序:
    [code="java"]
    package linyumin.test.thread;
    /**

    • @author llade
      *
      */
      public class VolatileObjectTest {

      /**

      • 相信绝大多数使用JAVA的人都没试出volatile变量的区别。献给那些一直想知道volatile是如何工作的而又试验不出区别的人。
      • 成员变量boolValue使用volatile和不使用volatile会有明显区别的。
      • 本程序需要多试几次,就能知道两者之间的区别的。
      • @param args */ public static void main(String[] args) { final VolatileObjectTest volObj=new VolatileObjectTest(); Thread t2=new Thread(){ public void run(){ System.out.println("t1 start"); for(;;){ volObj.waitToExit(); } } }; t2.start(); Thread t1=new Thread(){ public void run(){ System.out.println("t2 start"); for(;;){ volObj.swap(); } } }; t1.start(); }

      boolean boolValue;//加上volatile 修饰的是时候,程序会很快退出,因为volatile 保证各个线程工作内存的变量值和主存一致。所以boolValue == !boolValue就成为了可能。

      public void waitToExit() {
      if(boolValue == !boolValue)System.exit(0);//非原子操作,理论上应该很快会被打断。实际不是,因为此时的boolValue在线程自己内部的工作内存的拷贝,因为它不会强制和主存区域同步,线程2修改了boolValue很少有机会传递到线程一的工作内存中。所以照成了假的“原子现象”。
      }

      public void swap() {//不断反复修改boolValue,以期打断线程1.
      boolValue = !boolValue;
      }

    }

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM