【问题标题】:Thread Safety framework线程安全框架
【发布时间】:2010-03-11 07:30:11
【问题描述】:

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

【问题讨论】:

    标签: java multithreading thread-safety findbugs


    【解决方案1】:

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

    我不知道有什么静态分析工具可以自动捕捉到这种特殊情况,但我确定有一个。

    【讨论】:

    • 我认为 FindBugs 是目前最好的选择。
    【解决方案2】:

    这是一个经典的问题,称为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;
      }
    }
    

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

    但是还有其他有效的解决方案。

    【讨论】:

    • 这不是双重检查锁定。仔细阅读您链接的文章...
    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多