3

私はスレッドを独学しようとしていますが、synchronized() を機能させることができないようです。これは私がやっていることです:

クラス Test で変数を宣言しています

static String toggy = "false"; 

次に、この実行メソッドを使用した実行可能 (MyRunnable):

@Override
public void run() {
    synchronized (toggy) {
        System.out.println("toggy for " + name + " BEFORE = " + toggy);
        int b = 0;
        for(int i=0; i<1000; i++) {
            b++;
        }
        System.out.println("toggy for " + name + " AFTER = " + toggy);
        System.out.println("--------------------------------------------\n");

        if(toggy.equals("false")) {
            toggy = "true";
        } else if(toggy.equals("true")) {
            toggy = "false";
        }                                       
    }
}

私はここでこれをテストしています:

for (int i = 0; i < 90; i++) {
    Runnable task = new Test.MyRunnable(i+"");
    Thread worker = new Thread(task);
    worker.setName(String.valueOf(i));
    // Start the thread, never call method run() direct
    worker.start();
}                           

私が理解していることから、同期ブロックは、特定のスレッドの実行中に「toggy」の値が変更されるのを防ぐ必要があります。しかし、時々プログラムを実行すると、実行されます。私は何が欠けていますか?

4

1 に答える 1

4

に異なる値 (Stringインスタンス) を割り当てることによりtoggysynchronizedブロックは異なるオブジェクトをロックします。

synchronized ("false")
{
}

また:

synchronized ("true")
{
}

これにより、複数のスレッドがsynchronized保護対象のブロック コードに入ることができます。ロックに別のオブジェクトを使用します。

static final Object lock = new Object();

synchronized (lock)
{
}
于 2012-11-09T14:00:04.027 に答える