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

时间:2015-07-29 12:33:10

标签: java multithreading

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

2 个答案:

答案 0 :(得分:5)

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

为了让您的代码正常工作,您对该方法的所有调用的锁定(您正在同步的对象)必须相同

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

private final static Object LOCK = new Object();

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

synchronized(LOCK)

答案 1 :(得分:0)

使用唯一的对象进行同步。当您更改整数时,会创建一个新的整数,因为它们是不可变的。

示例:

public class BasicThread extends Thread {
    static Integer a = new Integer(0);
    private static String ab = "";

    void incr() {
        synchronized (ab) {
            a++;
            System.out.println(a);

        }
    }

    public void run() {

        incr();
        incr();
        incr();
    }
}