-1

我是线程和学习的新手。为什么这个数据竞赛?我知道如何使用该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);
    }
}
4

1 回答 1

3

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

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

private static Object syncObject = new Object();

public void run() {
    synchronized (syncObject) {
        //....
    }
}
于 2012-04-25T04:05:02.273 回答