首页 > 编程语言 > 详细

证明32位java对long和double的写操作不是原子性的

时间:2015-09-23 23:33:11      阅读:1671      评论:0      收藏:0      [点我收藏+]
public class Test {

    protected long l = -1l;

    public static void main(String[] args) {
        System.out.println(toBinary(-1l));
        System.out.println(toBinary(1l));
        Test t = new Test();
        Worker w1 = new Worker(t);
        Worker2 w2 = new Worker2(t);
        w1.setDaemon(true);
        w2.setDaemon(true);
        w1.start();
        w2.start();
        while (true) {
            if (t.l != -1l && t.l != 1l) {
                System.out.println(toBinary(t.l));
                System.out.println("l的写不是原子操作");
                break;
            }
        }
    }

    private static String toBinary(long l) {
        StringBuilder sb = new StringBuilder(Long.toBinaryString(l));
        while (sb.length() < 64) {
            sb.insert(0, "0");
        }
        return sb.toString();
    }
}

class Worker extends Thread {

    public Worker(Test t) {
        this.t = t;
    }

    private Test t;

    public void run() {
        while (true) {
            t.l = -1l;
        }
    }
}

class Worker2 extends Thread {

    public Worker2(Test t) {
        this.t = t;
    }

    private Test t;

    public void run() {
        while (true) {
            t.l = 1l;
        }
    }

	}

线程1和2不停的将l变量的值设置为 -1 和 1 ,结果,l的值既不等于1,也不等于-1

证明32位java对long和double的写操作不是原子性的

原文:http://my.oschina.net/u/1047640/blog/510397

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!