私は 2 つのスレッドを使用する Android アプリケーションで作業しています。最初の (ライター) スレッドは 2 つの変数を更新し、2 番目の (リーダー) スレッドは計算で両方を使用します。
2 番目のスレッドが正しい値を受け取るようにするにはどうすればよいですか?
これは私の最初の Java ロックの問題です。同期、揮発性、トライロックについて読んでいますが、まだ不明です。1 つの変数の場合、これは「簡単」ですが、2 つの変数に対してこれを行う方法がわかりません。
詳細:
変数は共有パブリック クラスにあります。 AppState extends Application:
public long appstate.writerVar1;
public int appstate.writerVar2;
メイン アクティビティでは、スレッドが作成され、appstate がスレッドに渡されます。
writerThread.appstate = appstate;
...
readerThread.appstate = appstate;
変数は、次のように writerThread と readerThread の両方からアクセスできます。
ライタースレッド、例:
appstate.writerVar1 = 1234;
appstate.writerVar2 = 5678;
リーダースレッド、例:
if( (appstate.writerVar1 == 9) && (appstate.writerVar2 == 6) ){
次のように動作するはずです:
writerThread:
- 両方の変数をロックする
- 両方を新しい値で更新する
- ロックを解除する
readerThread:
- 両方の変数をロックする
- 値を読み取る- ロックを
解除
する ありがとう!
--- 2012 年 4 月 23 日追加 ---
ありがとうございます。回答が遅れて申し訳ありませんが、変更可能なオブジェクトについても含めて、これについて詳しくお読みください http://www.javaranch.com/journal/2003/04/immutable.htm。
メイン アクティビティで作成される writerThread と readerThread からこれを呼び出す方法を理解しようとしたところ、次のコードが
思いつき
ました。
...
var1W = 123;
var2W = 456;
wsW = 新しい WriterState(var1W, var2W);
appstate.setWriterState(wsW);
readerThread:
プライベート WriterState wsR;
...
wsR = appstate.getWriterState();
var1R = wsR.getVar1();
var2R = wsR.getVar2();
このコードを試してみましたが、問題なく動作するようです。var1R と var2R の読み取りの間に、新しい var1W と var2W を追加できます。
次の質問:
a) このコードは大丈夫ですか?
b) setWriterState コードがループ内にあると仮定すると、これはすべてのメモリを消費しませんか?
c) WriterState クラスを可変にするにはどうすればよいですか。ここではそうではないと思います (あなたが言う: WriterState クラスが可変である場合)
ここでも例を見ましたhttp://tutorials.jenkov.com/java-concurrency/synchronized.html . Counter オブジェクトを両方のスレッドに渡しています。この場合、このようなことはありえませんか?