Rumah > Soal Jawab > teks badan
public class Test {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private static class Task implements Runnable {
public void run() {
try {
System.out.println(sdf.parse("2016-03-21 12:00:00").getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Task task = new Task();
Thread t1 = new Thread(task);
t1.start();
Thread t2 = new Thread(task);
t2.start();
Thread t3 = new Thread(task);
t3.start();
Thread t4 = new Thread(task);
t4.start();
Thread t5 = new Thread(task);
t5.start();
}
}
最近才知道,如果像上面代码那样通过定义静态共享的实例来使用SimpleDateFormat是会存在线程安全问题的。
例如线程被挂死:
或者转换的时间不对:
然后自己尝试读JDK源码来试图分析在SimpleDateFormat的代码中,究竟是哪里的函数或者代码会引起线程不安全,但是由于水平有限,最后还是找不出。
哪位大牛可以帮忙分析一下。
PS:我的jdk版本:1.8.0_73
ringa_lee2017-04-17 17:33:32
Saya melihat ulasan kod sumber parse(), dan terdapat bahagian yang ditulis oleh orang ini
Operasi penghuraian ini menggunakan {@link DateFormat#calendar
kalendar} untuk menghasilkan {@code Date}. Semua {@code
kalendar} ialah {@linkplain Calendar#clear()
dikosongkan} sebelum menghuraikan dan lalai {@code calendar}
nilai medan tarikh-masa digunakan untuk mana-mana yang hilang
maklumat tarikh-masa.
Maksud umum ialah kaedah parse() menggunakan kalendar untuk menjana contoh Tarikh yang dikembalikan. Masalahnya ialah kalendar yang digunakan di sini bukan yang baharu setiap kali kaedah itu dilaksanakan. atribut kalendar", mengikut maksud ulasan, sebelum setiap penghuraian, semua atribut yang berkaitan dalam kalendar akan dikosongkan, dan kemudian objek akan diisi dengan hasil pemprosesan baharu. Dalam kes ini, dalam berbilang benang, semasa pelaksanaan daripada parse(), ia akan Selepas satu thread baru sahaja menetapkan kalendar, thread lain mengosongkannya Kerana ia adalah contoh sdf, masalah lain sepatutnya disebabkan oleh
iniPHP中文网2017-04-17 17:33:32
private StringBuffer format(Date date, StringBuffer toAppendTo,
FieldDelegate delegate) {
// Convert input date to time field list
calendar.setTime(date);
boolean useDateFormatSymbols = useDateFormatSymbols();
...
}
Kalendar yang digunakan di sini ialah ahli kelas dan setTime berbilang benang akan menyebabkan isu keselamatan benang
伊谢尔伦2017-04-17 17:33:32
Ini tiada kaitan dengan pelaksanaan SimpleDateFormat Ia ada kaitan dengan anda menggunakan objek yang sama dalam berbilang urutan dan gagal menyegerakkan utas
.