2013-09-03 36 views
7

Tôi có một yêu cầu để chuyển đổi ngày đến định dạng chuỗi "20.130.212" (YYYYMMDD) để 2013/12/02 (DD/MM/YYYY)ngày chuyển đổi với ThreadLocal

sử dụng ThreadLocal. Tôi biết một cách để làm điều này mà không cần ThreadLocal. Ai giúp tôi với?

chuyển đổi mà không ThreadLocal:

final SimpleDateFormat format2 = new SimpleDateFormat("MM/dd/yyyy"); 
    final SimpleDateFormat format1 = new SimpleDateFormat("yyyyMMdd"); 
    final Date date = format1.parse(tradeDate); 
    final Date formattedDate = format2.parse(format2.format(date)); 
+0

Tại sao bạn cần sử dụng ThreadLocal? – JohnMark13

+0

Bởi vì SimpleDateFormats (và thực sự hầu hết các trường hợp Định dạng khác) không an toàn cho luồng. Xem [bài đăng trên blog] của tôi (https://stijndewitt.wordpress.com/2014/07/28/how-javas-text-formats-can-subtly-break-your-code/) về chủ đề này. –

Trả lời

9

ThreadLocal trong Java là một cách để đạt được thread-an toàn ngoài việc viết các lớp học không thay đổi. Vì SimpleDateFormat không phải là chủ đề an toàn, bạn có thể sử dụng ThreadLocal để làm cho nó an toàn.

class DateFormatter{ 

    private static ThreadLocal<SimpleDateFormat> outDateFormatHolder = new ThreadLocal<SimpleDateFormat>() { 
    @Override 
    protected SimpleDateFormat initialValue() { 
     return new SimpleDateFormat("MM/dd/yyyy"); 
    } 
}; 

private static ThreadLocal<SimpleDateFormat> inDateFormatHolder = new ThreadLocal<SimpleDateFormat>() { 
    @Override 
    protected SimpleDateFormat initialValue() { 
     return new SimpleDateFormat("yyyyMMdd"); 
    } 
}; 

public static String formatDate(String date) throws ParseException { 
    return outDateFormatHolder.get().format(
      inDateFormatHolder.get().parse(date)); 
}   
} 
+0

Cảm ơn Richie, Nhưng lớp học của bạn không làm việc nói rằng lớp học cơ thể, khai báo lĩnh vực không hoàn thành.i thêm thêm niềng răng đóng nhưng vẫn không có may mắn. Và cũng làm thế nào để loại bỏ các tài liệu tham khảo threadlocal khi calll là hơn. – user2680017

+0

kiểm tra ngay bây giờ. Tôi đã thêm niềng răng bây giờ. – Richie

+0

tại sao bạn muốn xóa tham chiếu ThreadLocal? – Richie

9

Ý tưởng đằng sau này là SimpleDateFormat không phải là thread-safe để trong một ứng dụng Mutil-ren bạn không thể chia sẻ một thể hiện của SimpleDateFormat giữa nhiều chủ đề. Nhưng kể từ khi thành lập SimpleDateFormat là một hoạt động tốn kém chúng ta có thể sử dụng một ThreadLocal như workaround

static ThreadLocal<SimpleDateFormat> format1 = new ThreadLocal<SimpleDateFormat>() { 
    @Override 
    protected SimpleDateFormat initialValue() { 
     return new SimpleDateFormat("yyyy-MM-dd"); 
    } 
}; 

public String formatDate(Date date) { 
    return format1.get().format(date); 
} 
+1

Mọi người có làm điều đó không? Nếu bạn (bản gốc l poster) không hiểu ThreadLocals đúng tôi khuyên bạn không nên sử dụng chúng. Tôi có thể xem xét FastDateFormat từ Commons Lang, hoặc DateTimeFormat từ thư viện JodaTime. Đây là một chuỗi dài và thú vị về chủ đề này .. http://jsr166-concurrency.10961.n7.nabble.com/Threadlocals-and-memory-leaks-in-J2EE-td3960.html – JohnMark13

+0

+1 .. hoặc một đồng bộ SimpleDateFormat –

+1

@ JohnMark13: Vâng, mọi người làm điều đó. Tôi cũng [khuyên dùng] (https://stijndewitt.wordpress.com/2014/07/28/how-javas-text-formats-can-subtly-break-your-code/). Làm thế nào là ông không hiểu ThreadLocals đúng? Joshua Bloch, tác giả của Effective Java nói trên liên kết của bạn: "Chủ đề này được rải rác với thông tin sai lạc. [..] Không có gì sai với chủ đề địa chỉ: Chúng không gây rò rỉ bộ nhớ. Chúng không chậm." Thảo luận là về các lỗi trong Tomcat và một số ứng dụng khác sử dụng các nhóm luồng và có các vấn đề triển khai với ThreadLocals. Chúng có thể và cần được khắc phục trong các ứng dụng đó. –

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