JVM常量池与多线程的关系

2019-11-18  本文已影响0人  Zak1

前阵子和同学交流的时候发现了这样一段代码,没有按照预定想法进行输出:

public class Demo implements Runnable {

    private Integer a = 0;
    @Override
    public void run() {
        for (int j = 0; j < 1_000_000; j++) {
            synchronized (a) {
                a++;
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Demo demo = new Demo();
        Thread t1 = new Thread(demo);
        Thread t2 = new Thread(demo);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(demo.a);
    }
}
//output
1145098

一开始想是不是因为synchronized住了对象a本身,然后又对a进行了修改,这样的操作会导致原子性丢失。于是尝试了将a放入一个单独的对象。代码如下:

public class Demo implements Runnable {

    //    private Integer a = 0;
    private A a = new A();

    static class A {
        public int value = 0;
    }

    @Override
    public void run() {
        for (int j = 0; j < 1_000_000; j++) {
            synchronized (a) {
                a.value++;
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Demo demo = new Demo();
        Thread t1 = new Thread(demo);
        Thread t2 = new Thread(demo);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(demo.a.value);
    }
}

//output
200000

神奇的是代码好像正常运行了,那么问题是出现在哪儿呢?

String a=new String("Hello World");

上面这段代码到底创建了几个对象?这是一个很经典的问题?

那这段代码创建的一个对象或者两个对象跟这次遇到的多线程问题有关吗?

上一篇 下一篇

猜你喜欢

热点阅读