Java SImpleDateFormat线程安全问题
PHP中文网
PHP中文网 2017-04-17 17:31:32
0
3
525
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

PHP中文网
PHP中文网

认证高级PHP讲师

membalas semua(3)
左手右手慢动作

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

  • Medan tarikh masa
  • 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

ini
Ty80
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

伊谢尔伦

Ini tiada kaitan dengan pelaksanaan SimpleDateFormat Ia ada kaitan dengan anda menggunakan objek yang sama dalam berbilang urutan dan gagal menyegerakkan utas

.
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan