2012-08-11 60 views
0

如果此類用於多線程環境並且說100個線程同時調用此方法。我們是否需要同步add()方法這個類?

案例1:實例方法

public class test { 

    public int add(int a , int b){ 

    return a+b ; 
    } 

} 

的情況下2:靜態方法

public class test { 

    public static int add(int a , int b){ 

    return a+b ; 
    } 

} 

請回答這兩種情況。

+0

可以請你理解意圖 - 語法在這裏並不重要。 – 2012-08-11 13:39:29

+0

它不是語法..它是語法! – Nishant 2012-08-11 13:40:21

回答

0

由於您沒有使用任何狀態/實例變量,因此您不需要synchronize方法或對象。

友好建議:使方法靜態。 Ans在課堂上給它打電話。

+0

感謝您的回覆。但IBM的一個白癡開始同步它;) – 2012-08-11 13:40:33

+0

請不要責怪整個公司,因爲少數人犯了一個錯誤...... IBM發佈了真棒代碼......他們有一些最好的電腦工程師。如果此答案解決了您的問題,請將其標記爲已回答,方法是單擊此答案旁邊的標記。 [見這裏如何](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。如果你喜歡答案,你也可以通過點擊答案旁邊的向上箭頭來進行投票。 – Nishant 2012-08-11 13:43:59

0

它不需要任何同步,因爲所有的變量都是本地的。即在任何呼叫者之間實際上不分配變量。

如果你這樣做了,你需要同步,因爲var c是共享的。在最後的'返回c'中檢索c之前,另一個線程可能已經修改了它。

public class test { 

    int c = 0; 

    public int addKeep(int a , int b){ 
      c = a + b; 
      return c; 
    } 
} 

其他答案在這裏說,使其爲靜態。那麼這取決於你需要做什麼。如果add(int a,int b)是子類可以覆蓋的行爲,則將其作爲實例方法保留。如果它是Math.class本身的一部分,那麼將其設爲靜態,因爲它可能永遠不需要被超越。

0

如果對象是可變的,並且您正在執行讀取更新操作,那麼只需要爲getter和setters(即mutating方法)使用同步塊。

+0

你正在回答你自己的問題? :)如果您有其他信息,請編輯您的問題。 – Nishant 2012-08-11 13:45:38