我有以下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()
(或Short
、Char
或Byte
)作为-128到127之间的值,您将获得一个共享缓存实例。
自动装箱处理
Integer i = 10;
Integer i = Integer.valueOf(10);
所以不同的i
变量实际上引用了Integer
的同一个实例,因此共享一个监视器。