Pola cek ganda disebutkan dalam Pasal 48 buku Java yang efektif, dan ditunjukkan bahwa pola ini biasanya tidak berlaku di Java. Struktur pola ini adalah sebagai berikut:
sumber daya publik getResource () {if (resource == null) {disinkronkan (this) {if (resource == null) {resource = new resource (); }}} mengembalikan sumber daya; }Pola ini merupakan peningkatan kode berikut:
Sumber Daya Sinkronisasi Publik GetResource () {if (Resource == null) {Resource = new Resource (); } mengembalikan sumber daya; }Tujuan kode ini adalah untuk menunda inisialisasi sumber daya. Tetapi setiap kali Anda mengaksesnya, Anda perlu menyinkronkan. Untuk mengurangi overhead sinkronisasi, mode pemeriksaan ganda tersedia.
Alasan mengapa mode pemeriksaan ganda tidak valid di Java adalah bahwa tipe referensi tidak aman-utas tanpa adanya sinkronisasi. Untuk tipe dasar kecuali mode pemeriksaan panjang dan ganda, ganda, berlaku. Misalnya, kode berikut benar:
Hitungan int pribadi; public int getCount () {if (count == 0) {disinkronkan (this) {if (count == 0) {count = computeCount (); // perhitungan yang memakan waktu}}} jumlah pengembalian; }Di atas adalah kesimpulan umum tentang idiom periksa ganda di Java. Tetapi semuanya belum berakhir, karena pola memori Java juga ditingkatkan. Doug Lea menulis dalam artikelnya: "Menurut model memori JSR133 JSR133 terbaru, jika jenis referensi dinyatakan sebagai volatile, mode pemeriksaan ganda akan berfungsi." Jadi di masa depan, Anda perlu menggunakan mode cek ganda di java, Anda dapat menggunakan kode berikut:
sumber daya swasta yang mudah menguap; sumber daya publik getResource () {if (resource == null) {disinkronkan (this) {if (resource == null) {resource = new resource (); }}} mengembalikan sumber daya; }Tentu saja, harus di Java yang mengikuti spesifikasi JSR133.
Oleh karena itu, periksa ganda tidak tersedia di J2SE 1.4 atau versi sebelumnya karena penulisan yang tidak sesuai pesanan saat menyetel dalam multi-threaded atau JVM. Masalah ini telah diperbaiki dalam J2SE 5.0, dan kata kunci yang mudah menguap dapat digunakan untuk memastikan singleton di bawah multi-threading.
kelas publik singleton {private volatile singleton instance = null; singleton publik getInstance () {if (instance == null) {disinkronkan (this) {if (instance == null) {instance = new singleton (); }} return instance; }}Metode yang disarankan adalah inisialisasi pada pemegang permintaan (IODH).
kelas publik singleton {kelas statis singletonHolder {static singleton instance = new singleton (); } public static singleton getInstance () {return singletonHolder.instance; }}Di atas adalah semua tentang artikel ini, saya harap akan sangat membantu bagi semua orang untuk belajar pemrograman Java.