2012-05-02 25 views
8
Synchronization 

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally 

Dòng trên được đề cập trong lớp JavaDoc của lớp SimpleDateFormat.java.text.SimpleDateFormat không phải là chủ đề an toàn

Có nghĩa là chúng ta không nên tạo các đối tượng SimpleDateFormat là tĩnh.

Và nếu chúng ta tạo ra nó là tĩnh, vì vậy bất cứ nơi nào chúng ta đang sử dụng đối tượng này, chúng ta cần giữ nó trong khối đồng bộ.

+2

có bạn là đúng –

+2

'java.time.format.DateTimeFormatter' mới (từ Java 1.8)" là không thay đổi và an toàn theo chủ đề ". Hãy xem: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html – Linuslabo

Trả lời

14

Có SimpleDateFormat không phải là thread an toàn và nó cũng được đề nghị khi bạn đang phân tích ngày cần truy cập theo cách đồng bộ.

public Date convertStringToDate(String dateString) throws ParseException { 
    Date result; 
    synchronized(df) { 
     result = df.parse(dateString); 
    } 
    return result; 
} 

một cách khác là trên http://code.google.com/p/safe-simple-date-format/downloads/list

21

Đó là sự thật. Bạn có thể tìm thấy các câu hỏi liên quan đến vấn đề này trên StackOverflow. Tôi sử dụng để khai báo nó như ThreadLocal:

private static final ThreadLocal<DateFormat> THREAD_LOCAL_DATEFORMAT = new ThreadLocal<DateFormat>() { 
    protected DateFormat initialValue() { 
     return new SimpleDateFormat("yyyyMMdd"); 
    } 
}; 

và trong các mã:

DateFormat df = THREAD_LOCAL_DATEFORMAT.get(); 
9

Thats đúng. FastDateFormat từ Apache Commons Lang là một lựa chọn thay thế an toàn đẹp.

Kể từ phiên bản 3.2, nó cũng hỗ trợ phân tích cú pháp, trước 3.2 định dạng duy nhất.

Các vấn đề liên quan