线程安全框架

时间:2010-03-11 07:30:12

标签: java multithreading thread-safety findbugs

以下类不是线程安全的(已在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;
   }
}

3 个答案:

答案 0 :(得分:4)

FindBugs可以找到代码中线程同步不一致的部分,即您在一个位置同步对一个字段的访问,而在另一个位置不同步。它也可以对JCIP annotations进行基本验证,但我相信目前仅检查@Immutable。

我不知道任何静态分析工具会自动捕捉到这个特例,但我确定存在。

答案 1 :(得分:0)

这是一个称为double checked locking problem的经典问题。

问题是您有一个race condition,因为您检查instance是否为null并分配了值。我喜欢Java的这个问题的一个解决方案是:

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

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

这种方法的工作原理是内部类在被引用之前不会被初始化(这会让你得到你的延迟加载)并且加载类是一个原子和线程安全的操作。

然而,还有其他有效的解决方案。

答案 2 :(得分:0)

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

  

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

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

  

对于编译时间,理想情况下在Eclipse中出现了摇摆下划线   告诉我们这个类不是线程安全的吗?

http://www.checkthread.org/index.html,这是一个开源项目,您可能希望看到示例here