java局部变量同步
我在下面的java代码中遇到了问题,这个程序总是以“KKBB”作为输出(所以看起来同步工作),所以我无法理解,因为我是一个局部变量,为什么同步在这里工作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
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);