Kelas DateFormat adalah kelas keselamatan yang tidak beracun. Dokumen Javadocs menyebutkan bahwa "format tanggal tidak dapat disinkronkan. Kami sarankan membuat format tanggal independen untuk setiap utas. Jika beberapa utas mengakses format tanggal pada saat yang sama, ini perlu menambahkan blok kode sinkron ke luar."
Kode berikut menunjukkan kepada kita cara menggunakan DateFormat di lingkungan utas untuk mengonversi tanggal string ke objek tanggal. Membuat contoh untuk mendapatkan format tanggal lebih efisien, karena sistem tidak perlu mendapatkan bahasa dan negara lokal berkali -kali.
Public DateFormatTest {Private Final DateFormat Format = new SimpleDateFormat ("yyyymmdd");
Kode ini tidak beracun. Kita bisa menyebutnya melalui beberapa utas. Dalam kode berikut, saya membuat kumpulan utas dengan dua utas, dan mengirimkan tugas konversi 5 tanggal.
Final dateFormattest t = new DateFormAttest (); kasus utas. = 0; .out.println (result.get cure);}
Hasil operasi kode tidak seperti yang kita inginkan-kadang-kadang, itu menghasilkan tanggal yang benar, dan kadang-kadang kesalahan output (seperti .sat Jul 31 00:00:00 BST 2012), kadang-kadang bahkan melempar NumberFormatException!
Cara menggunakan kelas DateFormat secara bersamaan
Kami dapat memiliki beberapa metode untuk menggunakan kelas DateFormat saat keamanan utas.
1. Sinkron
Cara termudah adalah mengunci objek DateFormat sebelum konversi tanggal. Metode ini memungkinkan hanya satu utas untuk mengakses objek DateFormat pada satu waktu, sementara utas lain hanya bisa menunggu.
Public Date Convert (Sumber String) melempar ParseException {disinkronkan (format) {date d = format.pars (sumber);
2. Gunakan Threadlocal
Metode lain adalah menggunakan variabel threadlocal untuk mengakomodasi objek DateFormat, yang berarti bahwa setiap utas memiliki salinan miliknya sendiri, dan tidak perlu menunggu utas lain untuk melepaskannya. Metode ini akan lebih efisien daripada menggunakan blok sinkron.
Public DateFormatTest {Private Static Final ThreadLocal <df = new ThreadLocal <TateFormat> () {{@Override DateFormat () () Return new SimpleDateFormat ("YYYYMMDD");}}; Tanggal d = df.get ().
3. Joda-Time
Joda-Time adalah tanggal JDK open source yang hebat dan alternatif API kalender.
Impor org.joda.time.datetime; Convert (Sumber String) {DateTime D = FMT.ParsEdateTime (Source);