我已经同步了整数对象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)

07-24 09:44