5

インターネットからファイルをダウンロードしている実行可能ファイルがあります。次のようになります。

class Downloader implements Runnable {
    volatile Status status;
    public void run() {
       // ...
       while (status.isInProgress()) { ... }
    }
}

ステータスは次のようになります。

public enum Status {
    PAUSED {
        public int someData() { return 0; }
    },
    INPROGRESS {
        public int someData() { return 1; }
    }

    public abstract int someData();

    private String msg; 
    public String getSomeMsg() {
        return msg;
    }
    public void setSomeMsg(String s) {
        msg=s;
    }

    public boolean isInProgress() {
        return this == INPROGRESS;
    }
}

ユーザーが一時停止ボタンを押すと、ステータス変数が GUI スレッドから PAUSED に設定されます。

コードは Java 1.6 でコンパイルされ、Android プラットフォーム用にコンパイルされています。

私の質問は、これが Enum をこのように設定/読み取るのにスレッドセーフかどうかです。ここで素晴らしい記事を読みました:

http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html

私はそれが保存されていることを確信していますが、列挙型についてはあまり語っていません。

4

2 に答える 2

4

したがって、このページではvolatile、プリミティブとオブジェクト (列挙型を含む) の両方で使用できます。また、こちらでご覧いただけるように、これはキーワークの典型的な使用volatileです。

注: 完了時にループが中断すると仮定すると (DONE 列挙値を定義しなかったため)、最悪のケースは、(i) ユーザーが一時停止し、(ii) 次の反復の前にダウンロードが終了した場合です。この場合、ユーザーは一時停止をクリックしますが、「ダウンロードが完了しました」というメッセージが表示されます。

于 2012-10-02T18:08:43.987 に答える
1

「ステータス」から値を読み取るスレッドが1つ以上あると思います。その場合、コードは「保存」されvolaile、処理中に CPU が常に「新しい」値を持つようにします (キャッシュから読み取ることはできません)。しかし、これは同時変更などを妨げるものではありません。あるスレッドが値を変更した場合、他のスレッドがその変更された値を読み取ることを保証するだけです。

于 2012-10-02T17:40:28.140 に答える