5

同期メソッドが完了すると、それによって変更されたデータのみがメイン メモリにプッシュされますか、それともすべてのメンバー変数がプッシュされますか?キャッシュ内のメンバー変数とその値をメイン メモリから読み取りますか? 例えば

public class SharedData
{

    int a; int b; int c; int d;

    public SharedData()
    {
        a = b = c = d = 10;
    }

    public synchronized void compute()
    {
        a = b * 20;
        b = a + 10;
    }

    public synchronized int getResult()
    {
        return b*c;
    }

}

上記のコードでは、compute が threadA によって実行され、getResult が threadB によって実行されると想定しています。compute の実行後、threadA はメイン メモリを a と b で更新するか、a、b、c と d を更新します。getResult を実行する前に、threadB はメイン メモリから b と c の値のみを取得しますか、それともキャッシュをクリアしてすべてのメンバー変数 a、b、c、および d の値をフェッチしますか?

4

3 に答える 3

3

synchronizedデータの一貫したビューを確保します。これは、最新の値を読み取り、他のキャッシュが最新の値を取得することを意味します。キャッシュは、特別なバス (JLS が必要とするものではありませんが、許可されています) を介して相互に通信できるほどスマートです。このバスは、一貫したビューを取得するためにメイン メモリにアクセスする必要がないことを意味します。

于 2012-07-31T07:16:42.747 に答える
2

次のスレッドがあなたの質問に答えるべきだと思います。

Javaでの同期のメモリ効果

実際には、キャッシュ全体がフラッシュされることはありません。

于 2012-07-31T05:56:26.880 に答える
1

1. synchronizedメソッドまたはアトミック ステートメントのキーワードは、1 つのスレッドのみがロックを取得できるようにすることで、変更可能なリソースへのアクセスをロックします。

2.変数への値のキャッシュの防止は、 volatileキーワードによって行われるようになりました。volatileキーワードを使用すると、インスタンス変数にアクセスするスレッドを作成してインスタンス変数のコピーをメモリに保存されたものと照合するように JVM に要求します。

3.さらに、上記の例では、threadAを実行するとcompute()両方とも同期メソッドであり、オブジェクトのすべての同期メソッドにアクセスできるのは 1 つのスレッドのみであるため、同時にメソッドにアクセスできませthreadB ん。getResult()its not the method that is locked but the Object. Its like this... Every object has one lock, and the thread which wants to access its synchronized block must get that lock

4.すべてのクラスにもlock があり、クラス内の静的変数の重要な状態を保護するために使用されます。

于 2012-07-31T05:32:55.473 に答える