为什么这个线程数据竞争?

时间:2012-04-25 04:00:53

标签: java multithreading race-condition

我是线程和学习的新手。为什么这个数据竞争?我知道如何使用Synchronized(){}方法,而不是使用修饰符。

public class SyncMethodDataRace extends Thread {

    private static int common = 0;

    public synchronized void run(){
        int local = common;
        local++;
        common = local;
    }


    public static void main(String[] args) throws InterruptedException {
        SyncMethodDataRace[] allThreads = new SyncMethodDataRace[20000];

        for(int i = 0; i < allThreads.length; i++){
            allThreads[i] = new SyncMethodDataRace();
        }

        for(SyncMethodDataRace d: allThreads){
            d.start();
        }

        for(SyncMethodDataRace d: allThreads){
            d.join();
        }

        System.out.println(common);
    }
}

1 个答案:

答案 0 :(得分:3)

通过制作run方法synchronized,您无法实现所需的同步。 synchronized方法锁定类的当前实例。在您的示例中,没有其他线程正在调用另一个线程的run方法,因此没有阻塞。

在您的情况下,您可能需要一个在所有实例之间共享的静态对象,即:

private static Object syncObject = new Object();

public void run() {
    synchronized (syncObject) {
        //....
    }
}