java.text.SimpleDateFormat không thread-safe

28/12/2024 java

Mình từng nghĩ format date là một công việc đơn giản và có thể viết pure function là được. Cho đến khi mình gặp lỗi khi dùng 1 instance java.text.SimpleDateFormat trong multithreading:

java.lang.NumberFormatException: For input string: "E.420242024E4"
	at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
	at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
	at java.base/java.lang.Double.parseDouble(Double.java:651)
	at java.base/java.text.DigitList.getDouble(DigitList.java:169)
	at java.base/java.text.DecimalFormat.parse(DecimalFormat.java:2202)
	at java.base/java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1937)
	at java.base/java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1545)
	at java.base/java.text.DateFormat.parse(DateFormat.java:397)

----

java.lang.NumberFormatException: For input string: ""
	at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
	at java.base/java.lang.Long.parseLong(Long.java:721)
	at java.base/java.lang.Long.parseLong(Long.java:836)
	at java.base/java.text.DigitList.getLong(DigitList.java:195)
	at java.base/java.text.DecimalFormat.parse(DecimalFormat.java:2197)
	at java.base/java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1937)
	at java.base/java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1545)
	at java.base/java.text.DateFormat.parse(DateFormat.java:397)

meme_confused Mình không muốn đào sâu xem nó lưu và sửa property nào trong object formater. Giải pháp là 1 SimpleDateFormat instance chỉ dùng cho 1 thread. Hoặc nếu dùng Java 8 trở đi thì đơn giản hơn là chuyển sang dùng java.time.format.DateTimeFormatter. 🍀