2010-03-11 59 views
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

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

我不知道任何静态分析工具,会自动捕捉这个特殊情况,但我确信存在。

+0

FindBugs有一个完整的“多线程正确性”类别。 – 2010-03-11 07:52:22

+0

我猜FindBugs是目前最好的选择。 – portoalet 2010-03-15 06:01:46

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; 
    } 
} 

这种工作方式是,内部类没有初始化,直到它的引用(这可以让你的懒加载)和加载类是原子和线程安全操作。

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

+1

这不是双重检查锁定模式的开源项目。阅读你更仔细地链接的文章... – 2010-03-11 08:19:22

0

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

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

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

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

http://www.checkthread.org/index.html,这是你可能希望看到的例子here