2014-01-26 59 views

回答

2

我會嘗試解釋主要的差異,然後顯示代碼來演示這些概念。

首先,名稱是一個用詞不當。代碼始終是線程安全的並且可重入安全。由於代碼是不可變的,因此代碼並不關心有多少線程正在執行它。相反,它的數據被操作的函數可能或可能不是線程安全的。在面向對象的代碼中比在C中更容易演示,但該概念也轉換爲C.

下面是一個使用Java的一個簡單的例子:

Class MyClass 
{ 
    private int _counter; 

    public MyClass() 
    { 
     _counter = 0; 
    } 

    public int unsafeMethod() 
    { 
     _counter = _counter + 1; 
     return _counter; 
    } 

    public int safeMethod(int a, int b) 
    { 
     return a + b; 
    } 
} 

在前面的例子,unsafeMethod是不安全的,因爲它修改的變量。如果線程同時執行該方法,結果將不確定。 safeMethod是安全的,因爲它只取決於傳入的值,並不以任何方式修改它們。

注意:這些事情都不足以確定線程安全性,但它們會爲您提供良好的基準以確定代碼是否爲線程安全。