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