5

私は2つのスレッドを持っています。最初のスレッドは setX メソッドを呼び出し、2 番目のスレッドは getX メソッドを呼び出します。書き込みスレッドが 1 つしかありませんが、同期されたメソッドを設定する必要がありますか? また、2 番目のクラスと volatile 変数を使用してスレッドの問題を解決できますか?

public class Test {
    private int x;  

    public synchronized  void setX(int x) {
        this.x = x;
    }

    public synchronized  int getX() {
        return this.x;
    }
}

public class Test2 {
    private volatile int x; 

    public void setX(int x) {
        this.x = x;
    }

    public int getX() {
        return this.x;
    }
}
4

3 に答える 3

7

synchronized ここで使用する のではなくvolatile、私は個人的に使用しますAtomicInteger

public class Test {
    private final AtomicInteger x = new AtomicInteger();  

    public void setX(int value) {
        x.set(value);
    }

    public int getX() {
        return x.get();
    }
}

(私はあなたのget/も修正したことに注意してくださいset-以前はあなたgetXが設定していて、あなたsetXは取得していました...)

于 2013-01-28T19:42:35.857 に答える
1

あなたの質問に答えるには、はい、何らかの形式の同期が必要です。共有状態は単一の変数であり、この変数は typeintであるため、書き込みはアトミックになります (変数が long または double の場合はそうではありません)。ただし、可視性の問題がないことを確認するために、同期が必要です。スレッド A は変数に書き込むことができ、スレッド B は書き込まれた値を見ることができず、以前の値を見ることができませんでした。

この場合、同期は、synchronized、volatile、または AtomicInteger を使用して実装できます。これらすべての手法により、変数の後続の読み取りから書き込みが確実に見えるようになります。

于 2013-01-28T19:46:45.253 に答える
0

Volatilevariable は、スレッドに対する変数の可視性とコードの順序のみを保証します。ただし、メソッドの所有権をスレッドに提供するわけではありません。Synchronizedキーワードにより、スレッドはsynchronizedメソッドの所有権を持つことができます。

あなたのクエリで行く:

最初のスレッドがsetXメソッドを呼び出し、2 番目のスレッドがメソッドを呼び出します。書き込みスレッドは 1 つしかありませんがgetX 、メソッドを設定する必要がありますか?synchronized

あなたが望むものに応じて。Thread1 呼び出しgetXの後にのみ Thread2 呼び出しが必要な場合はsetX、はい、メソッドを同期する必要がありますがwait()notify()メソッドも使用する必要があります。

volatile2 番目のクラスと変数を使用してスレッドの問題を解決することもでき ますか?

繰り返しますが、それはあなたが望むものに依存します。スレッド 2 が他のメソッドから呼び出されたメソッドを気にgetXせずにメソッドを呼び出すようにする場合は、スレッド 2 が の最新の値を取得できるように を使用する必要があります。setXThreadvolatilex

于 2013-01-28T19:58:06.513 に答える