[英]ThreadLocal variable for SimpleDateFormat (OR) new SimpleDateFormat - Correct?
[英]Defining a Constant for new SimpleDateFormat
我正在構建一個 java 應用程序。 我的應用程序不是多線程的,我想為SimpleDateFormat
聲明常量,以便我可以在多個地方使用它。
1.
public static final ThreadLocal<SimpleDateFormat> DATE_FORMAT_YYYY_MM_DD = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
public static SimpleDateFormat DATE_FORMAT_YYYY_MM_DD = new SimpleDateFormat("yyyy-MM-dd"));
在普通 java 應用程序中,哪種方法更好。 據我所知SimpleDateFormat
不是線程安全的,我試圖將其標記為靜態的,這不好。 在普通的 java 應用程序中,哪種方法更好。
LocalDate // All java.time classes are threads-safe, unlike the troublesome legacy date-time classes.
.parse( "2023-01-23" ) // Parse text in standard ISO 8601 format by default, without defining any formatting pattern.
.toString() // Generate text in standard ISO 8601 format.
如果您絕對確定永遠不會跨線程訪問此對象,那么您的兩個選項同樣適用。
如果將來有可能使用多個線程,那么您必須使用第一個,並帶有ThreadLocal
。
SimpleDateFormat
類不是線程安全的。 這意味着使用該類的對象跨線程解析或生成文本可能會導致未定義的行為。 未定義的行為是不好的。
因此,您展示的第二種方法創建了一個要跨線程使用的對象。 不好。 第一種方法為每個線程創建一個對象,因此它只能單獨使用,絕不能跨線程使用。 那更好。
制作ThreadLocal
沒有缺點。 因此,只要現在或將來有機會使用多線程,我當然會建議對於已知不是線程安全的對象。
但最好的方法是停止使用SimpleDateFormat
。 該類是現在遺留的可怕日期時間類的一部分,多年前已被 JSR 310 中定義的現代java.time類所取代。
java.time的眾多優點之一是其所有類的線程安全。
因此,您可以在任何地方創建DateTimeFormatter
( SimpleDateFormat
的替代品),並在需要時跨線程使用它。 沒問題。
對於大量使用DateTimeFormatter
的極端情況,您可能希望創建一個單例以供重用,而不是重復重新實例化。
此外,您所需的格式是LocalDate#parse
和LocalDate#toString
使用的默認格式。 所以根本不需要任何格式化程序對象!
LocalDate ld = LocalDate.parse( "2023-01-23" ) ;
String output = ld.toString() ;
如果卡在 Java 6 或 Java 7 上,請將ThreeTen-Backport庫添加到您的項目中。 這個庫通過幾乎相同的 API 提供了大部分java.time功能。 但我強烈建議您考慮遷移到 Java 的LTS版本:Java 8、11 或 17。
如果您只有一個線程並且看不到任何合理的機會在不久的將來必須引入另一個線程,則無需使用ThreadLocal
。 將它作為public static final
應該沒問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.