4

次のクラスはスレッドセーフではありません ( Proving the following code not thread safeで証明されているように)

コンパイル時/実行時の分析のいずれかに役立ち、以下がスレッドセーフではないことを教えてくれるフレームワークはありますか?

コンパイル時に理想的には、Eclipse で波状の下線が表示され、クラスがスレッドセーフではないことがわかりますか?

実行時に、静的コード分析でクラスが非スレッドセーフとして検出されますか?

public class LazyInitRace {
   private ExpensiveObject instance = null;

    public ExpensiveObject getInstance() {
    if (instance == null)
      instance = new ExpensiveObject();
    return instance;
   }
}
4

3 に答える 3

4

FindBugsは、スレッド同期が矛盾しているコードの部分を見つけることができます。つまり、ある場所ではフィールドへのアクセスを同期し、別の場所では同期していません。JCIP アノテーションに対する基本的な検証も実行できますが、現時点では @Immutable のみがチェックされていると思います。

この特定のケースを自動的にキャッチする静的分析ツールは知りませんが、存在することは確かです。

于 2010-03-11T07:45:08.580 に答える
0

これは、ダブル チェック ロック問題と呼ばれる古典的な問題です。

問題は、競合状態であるかどうかを確認して値を割り当てるため、競合状態が発生することです。私が Java で気に入っているこの問題の 1 つの解決策は次のとおりです。instancenull

public class LazyInitRace {
  private static class Container {
    public final static ExpensiveObject INSTANCE = new ExpensiveObject();
  }

  public ExpensiveObject getInstance() {
    return Container.INSTANCE;
  }
}

これが機能する方法は、内部クラスが参照されるまで初期化されず (これにより遅延読み込みが行われます)、クラスの読み込みはアトミックでスレッドセーフな操作です。

ただし、他の有効なソリューションがあります。

于 2010-03-11T07:33:03.470 に答える
0

この質問が尋ねられたり回答されてから長い時間が経ちましたが、今日、Google で検索中にこの質問に出会いました。

コンパイル時/実行時の分析のいずれかに役立ち、以下がスレッドセーフではないことを教えてくれるフレームワークはありますか?

www.contemplateltd.com では、高度な静的分析ツールを開発しました。しかし、それは無料ではありません。

コンパイル時に理想的には、Eclipse で波状の下線が表示され、クラスがスレッドセーフではないことがわかりますか?

http://www.checkthread.org/index.html、これはオープンソース プロジェクトです。ここで例を参照してください。

于 2014-01-07T17:49:02.307 に答える