Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java局部变量同步_Java_Multithreading - Fatal编程技术网

java局部变量同步

java局部变量同步,java,multithreading,Java,Multithreading,我在下面的java代码中遇到了问题,这个程序总是以“KKBB”作为输出(所以看起来同步工作),所以我无法理解,因为我是一个局部变量,为什么同步在这里工作 class Test implements Runnable { public void run() { Integer i=10; synchronized(i) { try { System.out.print(Thread.cu

我在下面的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();
    }
}

我听说,由于每个方法的局部变量都有不同的副本,因此同步将无法工作,请帮助我理解,感谢

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

自动包装治疗

Integer i = 10;
作为

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

对--不同步变量,就同步对象。
synchronized(i)
语句不操作变量,它对变量所引用的对象进行操作。正如@chrylis指出的,
Integer.valueOf(10)
总是引用同一个缓存的Integer对象。
Integer i = Integer.valueOf(10);