Java本地变量同步



我有以下java代码的问题,这个程序总是给"KKBB"作为输出(所以似乎同步工作),所以我无法理解,因为我是一个局部变量,为什么同步在这里工作?

class Test implements Runnable {
    public void run() {
        Integer i=10;
        synchronized(i)
        {
            try {
                System.out.print(Thread.currentThread().getName());
                Thread.sleep(1200);
                System.out.print(Thread.currentThread().getName());
            } catch (InterruptedException e) {
            }
        }
    }
    public static void main(String[] args) {
        new Thread(new Test(), "K").start();
        new Thread(new Test(), "B").start();
    }
}

我听说由于局部变量对每个方法有不同的副本,所以同步不起作用,请帮助我理解,谢谢

包装器类对于小值有特殊的行为。如果您使用Integer.valueOf()(或ShortCharByte)作为-128到127之间的值,您将获得一个共享缓存实例。

自动装箱处理

Integer i = 10;

Integer i = Integer.valueOf(10);

所以不同的i变量实际上引用了Integer的同一个实例,因此共享一个监视器。

最新更新