2014-09-29 83 views
0

我有一個實用方法作爲的Util類:是我的靜態util的方法線程安全

public static String formatAmount(String amount) throws Exception { 
    return String.format("%,.2f", Double.valueOf(amount)); 
} 

是這種方法的線程安全嗎?我沒有修改任何其他地方的金額。其次,我有另一種方法。

private boolean checkIfDateIsAHoliday(org.joda.time.LocalDate date) { 
    boolean isHoliday = false; 
    ....... 
    return isHoliday; 
} 

此方法線程安全嗎?我不會在其他地方修改日期。

+3

第一種方法是線程安全的,第二種方法......誰知道?這是一個實例方法,因此它可能會修改對象狀態或調用另一個非線程安全的實例方法(然後它可能不是線程安全的)。沒有代碼就沒有答案。 – 2014-09-29 10:23:18

+0

你是否在第二種方法中修改任何實例級別/類級別字段?如果它只修改* method-local *變量,那麼它是線程安全的。 – TheLostMind 2014-09-29 10:31:32

+0

如果.......線程安全,則第二種方法僅爲「線程安全」。你離開了什麼? – 2014-09-29 16:59:30

回答

1

線程安全就是訪問共享狀態。所以,如果你想知道,如果一個方法是線程安全的,你只需要檢查它是否訪問狀態(=字段)也可以通過其他線程訪問:

  • 如果不存在這樣的狀態,你」重新完成 - 該方法是線程安全的。
  • 如果有這樣的狀態,您必須檢查它是否以線程安全方式訪問。

(也參見http://tutorials.jenkov.com/java-concurrency/thread-safety.html

不訪問任何共享狀態的第一方法(String是不可變的,因此參數是線程安全本身)。它調用兩個可能訪問共享狀態的靜態方法(String.formatDouble.valueOf)。不幸的是,javadoc沒有提及這兩種方法的線程安全性。不過,我們可以假設它們(否則幾乎所有的Java應用程序都被破壞了)。

您的第二種方法對於我們可以看到的代碼是線程安全的(我們不能爭論.....背後的代碼)。原因:您只是修改本地狀態(堆棧變量isHoliday)。由於本地狀態不能被其他線程訪問,所以根據定義,這是線程安全的。

現在只是試圖爭論有關其他代碼(.....)!

5

一如既往地獄在小細節。你的第一個方法是線程安全的,因爲它絕對不會改變任何類的狀態。

您的秒數方法僅可部分使用。我不知道你的代碼中寫的是什麼,而不是.......。如果你不改變狀態你的任何類那裏的方法是線程安全的,否則它不是。

0

對於第一種方法,將是線程安全的,但 這不會是線程安全的,你已經在第二

+2

謹慎解釋原因? – Henry 2014-09-29 10:25:33

+0

我的意圖是第二種方法可能或不可能是線程安全的,因爲我們不知道實際的執行 – santhosh 2014-09-29 10:29:39

+0

@santhosh - 請解釋爲什麼第一個線程安全。 – TheLostMind 2014-09-29 10:32:44

0

第一個聲明的方法是線程安全的,因爲你只是讀一個不可變的變量String

喬達的LocalDate也是不可變的。因此,假設您沒有讀取或寫入可變類或實例字段,則此方法也是線程安全的。