-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 に答える