我已经同步了整数对象a,并且期望输出1 2 3 4 5 6 7 8 9
但是仍然给我其他输出。问题出在哪里,因为我已经同步了每个线程试图访问的变量。
package thread;
public class BasicThread extends Thread {
static Integer a=new Integer(0);
void incr() {
synchronized (a) {
a++;
System.out.println(a);
}
}
public void run() {
incr();
incr();
incr();
}
public static void main(String[] args) throws InterruptedException {
BasicThread bt=new BasicThread();
BasicThread bt1=new BasicThread();
BasicThread bt2=new BasicThread();
bt.start();
bt1.start();
bt2.start();
}
}
最佳答案
请注意:整数对象是不可变的。因此,这里发生的是:每次您执行“ a ++”操作时,编译器实际上会自动装箱;最后,将创建一个新的Integer对象。
为了使代码正常工作,对方法的所有调用的锁(要同步的对象)必须相同。
换句话说:对不断变化的对象的引用...不能用作锁的好选择。相反,请执行以下操作:
private final static Object LOCK = new Object();
(使用final有助于确保该对象引用不会随时间变化),然后:
synchronized(LOCK)