4

下面的类不是线程安全的(证明下面的代码不是线程安全的

是否有一个框架可以帮助编译时/运行时分析并告诉我们以下不是线程安全的?

对于编译时,理想情况下在 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

这是一个经典的问题,称为双重检查锁定问题

问题是您有竞争条件,因为您检查是否instance存在null并分配值。我喜欢在 Java 中解决这个问题的一种方法是:

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

虽然这个问题被问或回答已经很久了,但今天我在谷歌搜索时遇到了这个问题。

是否有一个框架可以帮助编译时/运行时分析并告诉我们以下不是线程安全的?

www.contemplateltd.com ,他们开发了一种先进的静态分析工具。但它不是免费的。

对于编译时,理想情况下在 Eclipse 中会出现摆动的下划线并告诉我们该类不是线程安全的?

http://www.checkthread.org/index.html,这是开源项目,您可能希望在此处查看示例

于 2014-01-07T17:49:02.307 回答