Javaで同期していない場合は、1つによって更新された変数の値は、最終的には別のスレッドから見たスレッドのでしょうか?

玉林:

変数の値が1スレッドAによって更新され、その後、別のスレッドBによって読み取られた場合、私は知っている、新しい値が古い値を取得する可能性がありますスレッドBとBに見られないかもしれません。コンピュータは非常に高速であると私の質問は、私がこれを可能に待ち時間の問題は、ミリ秒のオーダーであると私たちが言う分または数時間もの時間スケールについて取っている場合Bは最終的に新しい値が表示されます仮定してもよいですか?

なぜ私はこのことについて聞いてるのよ、私は以下のようにいくつかのレコードと作品を保ちマップを持っている私のコードです。

  1. ユーザーがマップにレコードを追加します。

  2. ユーザーは、いくつかの作業を行うに行きます。

  3. ユーザーが戻ってレコードを削除します。

多くのユーザーが同時にこれを行います。ステップ1とステップ3(アッカ俳優スレッドが特定されるように)非常に速く、同じスレッドで実行され、ステップ2は時間がかかり、別の作業スレッドで行われます。今STEP2作業が時々失敗すると、ステップ3はレコードがマップ内に蓄積することが実行されていないと忘れて飽きないことがあり、私は忘れてしまったレコードのマップをチェックして、メモリリークを避けるために、それらを削除するスケジューラ・スレッドを設定し、検査期間は数時間などであります失敗は、それが非並行マップを使用することは現実的にOKで、このシナリオの下で、非常にまれにしか起こりませんか?

dm03514:

単一アッカ俳優スレッドがマップにアクセスするための責任があり、マップがメモリである場合はその役者にローカル、すべきではない、同時マップを使用する必要が。同時アクセス、および任意の競合状態のチャンスがない何がないからです。

マップは更新/削除俳優とクリーンアップの俳優/スレッド間でメモリを共有されている場合は問題があります。この場合、同期化するか、他のデータ競合があるかもしれないことが必要であろう。

これは、マップを反復処理するためにブロックされるも(自分の演技に影響スループットパフォーマンスを/持っていますが、シンプルで安全な最初のアプローチになります)クリーンアップメッセージのいくつかの並べ替えをサポートする更新/削除俳優、によって回避することができ、クリーンアップ孤立したレコード。


あなたの質問に答えるためにあるOKしないマップが複数のアクター/スレッド間で共有されている場合非同時(非同期の)マップを使用します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=335919&siteId=1