2012-03-22 8 views
0

私はJavaの並行性について話しながら、インタビューで次の質問をしました。私は良い戦略を思いつきませんでした。何か案は?コードを同期させずに、Javaのリソースへのアクセスをどのように共有しますか?

コードを同期させずに、Javaのリソースへのアクセスをどのように共有しますか?

+4

すべてのアクセスを読み取り専用に制限しますか?サブスクライバごとにリソースをコピーしますか?アトミックな参照を使用して同期をエミュレートしますか? – maerics

+0

私は自分の状況がどのように見えるかを精緻化すると思っており、達成したいことは最終的にはより良い/より役に立つ回答に役立ちます – posdef

答えて

7

ステートレス共有リソースを作成し、それを除けば、ここではいくつかのアイデアです:

  1. 読み取り専用にすべてのアクセスを制限する:何も同時スレッドの任意の数が安全にそれへのアクセスを読んだことができ、リソースを更新されていない場合。

  2. コピー加入者あたりのリソース:任意の数のスレッドがリソースの独自のコピーを持って安全に自分自身のコピーを持つ他のスレッドに影響を与えることなく、それを変更することができます。 (例えばThreadLocal

  3. 使用同期をエミュレートする原子参照:「ゲッター」メソッドの使用のみことを確認するために「チェックイン」/「チェックアウト」システムを作成する(例えば、AtomicBoolean)原子参照をチェック1つのスレッドはリソースへのアクセス権を持ち、同期は必要ありません。

  4. java.util.concurrent.locksからロックを使用します。​​キーワードを使用せずに同じ(またはより良い)機能を提供することができます。

もちろん、面接官は追加の制限を課すかもしれませんが、これらはあなたの質問の小さな情報が与えられた良い出発点です。

1

それが可能だが、何が私の心に来る場合には、状況によって異なります は、共有リソースは不変くださいまたはリソースが、その後何の同期が必要とされない不変である場合

0

volatileキーワードを使用して「コードを同期する」と考えられない場合は、状況によっては役立つかもしれません。 ConcurrentHashMapやVectorのようにすでに同期化されているコレクションクラスを使うのはどうですか?

関連する問題