使对象同步后同步不起作用

Abh*_*pta 2 java multithreading

我已经同步了Integer对象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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 5

请注意:整数对象是不可变的.所以,这里发生的是:每次你做一个"a ++"......编译器实际上做自动装箱; 最后...... 创建一个新的 Integer对象.

为了使代码正常工作,对于方法的所有调用,锁(要同步的对象)必须相同.

换句话说:对不断变化的对象的引用......不适合用作锁.相反,做一些像:

private final static Object LOCK = new Object();
Run Code Online (Sandbox Code Playgroud)

(使用final有助于确保此对象引用不会随时间而变化)然后:

synchronized(LOCK)
Run Code Online (Sandbox Code Playgroud)