Javadoc cho SimpleDateFormat nói rằng SimpleDateFormat không được đồng bộ hóa.
"Các định dạng ngày không được đồng bộ hóa. Bạn nên tạo các phiên bản định dạng riêng biệt cho từng chuỗi. Nếu nhiều chuỗi truy cập đồng thời vào một định dạng, thì định dạng đó phải được đồng bộ hóa bên ngoài."
Nhưng đâu là cách tốt nhất để sử dụng một phiên bản của SimpleDateFormat trong môi trường đa luồng. Dưới đây là một vài lựa chọn mà tôi đã nghĩ đến, trước đây tôi đã sử dụng các tùy chọn 1 và 2 nhưng tôi tò mò muốn biết liệu có lựa chọn thay thế nào tốt hơn hoặc tùy chọn nào trong số này sẽ mang lại hiệu suất và tính đồng thời tốt nhất.
Tùy chọn 1: Tạo phiên bản cục bộ khi được yêu cầu
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
Tùy chọn 2: Tạo một thể hiện của SimpleDateFormat như một biến lớp nhưng đồng bộ hóa quyền truy cập vào nó.
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
Tùy chọn 3: Tạo một ThreadLocal để lưu trữ một phiên bản SimpleDateFormat khác nhau cho mỗi luồng.
private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>();
public String formatDate(Date d) {
SimpleDateFormat sdf = tl.get();
if(sdf == null) {
sdf = new SimpleDateFormat("yyyy-MM-hh");
tl.set(sdf);
}
return sdf.format(d);
}