0

私たちのアプリ (Java for Android で作成) にThreadは、int フィールドを含む派生クラスがあります。

public class MyThread extends Thread {

    public int myValue = 0;

    public void doWork() {

        while (true) {
            System.out.println(myValue);
        }
    }
}

// On some other thread
myThread.myValue = 42;

MyThreadクラスは int フィールドからのみ読み取りますが、別のスレッドに書き込みたいのですが (上記の例のように)。

私が知っているように、Java の int などのプリミティブ型はアトミックに読み書きされます。

synchronizedこの int フィールドへのアクセスを (キーワードを使用して) 保護する必要がありますか?

Java メモリ モデルによると、いくつかのスレッドによって共有されるメモリへの更新は、明示的に伝達されない限り、見られない可能性があることをここで読みました。

引用:明示的な通信がなければ、他のスレッドがどの書き込みを認識できるかを保証できません

このフィールドへのアクセスを保護する必要がありますか、それとも別のスレッドで必要な変更を行わずに (原子的に) 更新できますか?

4

3 に答える 3

2

int 変数をどのように更新しますか? 直接変更の場合は、変数を volatile に設定すると便利です。
public volatile int myValue = 0;
ただし、更新はread-modifyスレッドを相互に同期する必要があるためです。
そして[このリンク]は揮発性を理解するのに役立ちます

于 2013-10-31T09:26:36.133 に答える
1

Java の int などのプリミティブ型は、アトミックに読み書きされます。

スレッドは、あるスレッドによって書き込まれた変数の値を常に認識します。何もないところから引き出されたランダムな値ではありません。として宣言されていない限りvolatile、JVM は 64 ビット値を 2 つの 32 ビット fetch 操作として扱うことが許可されているため、64 ビット数値変数 (long および double) は外部安全性を持ちません。したがって、プリミティブ型を使用していても、使用する必要がありますVolatile

マルチスレッドにはもう 1 つ、2 つのことがあります。1. 原子性 2. 可視性

揮発性は、原子性部分ではなく可視性部分を保証します。K++したがって、必要以上に変数をインクリメントしている場合はsynchronize、その部分を保証していませんatomicity

于 2013-10-31T09:10:26.377 に答える