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