`
wjm251
  • 浏览: 109005 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

show一下java中的volatile的作用

    博客分类:
  • java
阅读更多
具体作用就不多讲了,大概就是保证可见性和防止重排序。 其实很早前就知道有这个关键字,试过很多次,总觉得加了和没加效果一样。
这次终于在阅读《java并发程序实践》(顺便义务广告一下,好书)的时候有了灵感,写了一段很普通的代码:
public class NoVisibility {
    private boolean ready=false;
    int num;
    private class ReaderThread extends Thread {
        public void run() {
            int count = 0;
            while (!ready)
            {
                count++;
            }
            System.out.println(num);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        NoVisibility x = new NoVisibility();
        x.new ReaderThread().start();
        x.num = 43;
        x.ready = true;
        System.out.println("main Thread end");
    }
}

再写一段python来不停地调用它(因为不一定总能出现),不久后就会发现不返回了,ready值的更新一直对ReaderThread线程不可见。如果ready加个volatile就不会有问题了,可以一直运行。
import os
i=0
while True:
    os.system("java -server NoVisibility")#or os.popen
    i+=1
    print "run count"+str(i)


感受:
1.java运行时加参数-server用server版的虚拟机出问题几率很高,据说是server才经过大量优化。
2.while (!ready)的循环内如果有System.out操作时,也几乎不出问题,提高了可见性?(这个是我的猜测)

=====2011.3.19=======《java并发编程实践》其实给出个更好的例子===============
由于asleep在循环中没改变,所以在server版的jvm中会被优化,提出循环判断,结果搞成个死循环。这个是必现得

java -server -cp . visibility
public class visibility {

    boolean asleep = false;
    public void run1()
    {
        int i=0;
        while (!asleep)
            i++;
        System.out.println(i);
        System.out.println("end");
    }
    public static void main(String[] args) {
        
        final visibility a = new visibility();
        
        new Thread(){
            public void run() {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                a.asleep = true;
            };
        }.start();
        a.run1();
    }
}
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics