2014-02-17 47 views
4

如果我有以下方法;是一個電話Calendar.getInstance()線程安全?Calendar.getInstance線程安全

public Date currentTime() { 
    Date d = null; 
    synchronized(this){ 
     d = Calendar.getInstance().getTime(); 
    } 
    return d; 
} 

我的理解是Calendar.getInstance()不是線程安全,這樣下面的方法不能是線程安全的。這是對的嗎?

public Date currentTime() { 
    return Calendar.getInstance().getTime(); 

} 

我明白Joda-Time被宣傳爲日期時間API的最佳實踐,但在這裏我堅持標準java.util.Date/Calendar類。

+0

爲什麼你不能獲得日曆一次,並在外部類中保存該日曆,然後在getTime()中使用已有的引用? – Rob

+0

你無法使用[Joda-Time](http://www.joda.org/joda-time/)是一種恥辱。線程安全是Joda-Time的主要設計目標。如果您可以使用Java 8,請查找受到啓發的新捆綁[java.time。*包](http://download.java.net/jdk8/docs/api/java/time/package-summary.html)由Joda-Time定義並由JSR 310定義。 –

回答

8

是的,Calendar.getInstance()是線程安全的,因爲每個調用都會創建並返回一個新實例。通過同步或將getTime()返回的值存儲在臨時變量中,您無法獲得任何結果。

1

爲什麼在這種情況下線程安全?您沒有修改任何變量,並且時間由系統管理。因此,任何對該方法的調用都會爲您提供系統的當前時間。根據我的意見,不需要同步。