6

競合状態とは何か、競合状態を回避する方法、および Java コードでそれを見つける方法について、誰でも説明できますか?

さて、私は「競合状態」を数日知っています.2つの例があります.おそらくそれらは十分ではないので、あなたの助けが必要です.

例 1: 確認してから行動する:

if(vector.contains(e))//check
{
vector.remove(e)
}

アクセスできるスレッドが 2 つあり、ベクトルに e が含まれていることを確認した後でスレッド 1 が一時停止し、e がベクトルに含まれている場合、スレッド 2 がアクセスしてチェックし、ベクトルから e を削除すると、スレッド 1 が戻ってきて削除アクションを実行すると、エラーが発生します。 thread2 によって既に削除されています。

例 2: 読み取り変更書き込み:

メソッドにカウンター変数があるとします。メソッドが呼び出されると、カウンターは 1 増加します。

counter++

これはアトミック操作ではなく、次の 3 つのステップがあります。 1. 値を取得する 2. 値を増やす 3. 値を代入する

競合状態について私が知っていることはすべてここにあります。あなたの知識を私と共有していただければ幸いです:)

ありがとう

4

3 に答える 3

4

競合状態とは何ですか? このスタックオーバーフローの質問を確認してください。

競合状態には主に 2 つのシナリオがあります。読み取り-変更-書き込みとチェック-その後-アクトです。

読み取り-変更-書き込みの古典的な例はcounter++、アトミック操作ではないため、競合状態につながります。

check-then-act には、複数の例があります。1 つの例は、ConcurrentHashMap でキーの存在を確認してから、if-case で何らかの作業を行う場合です。もう 1 つの例は、シングルトン クラスのコードです。

public Singleton getInstance()
{
   if(_instance == null)
   { 
      _instance = new Singleton();
   }
}

それらの詳細については、インターネットで読むことができます。並行性に関する優れた書籍の 1 つは、Brian Goetz による Java Concurrency in Practice です。こちらの記事も参考になります。

于 2014-12-29T10:15:26.973 に答える