Double Checked Locking dengan Volatile
Double Checked Locking adalah teknik biasa yang digunakan di Java untuk memastikan objek tunggal hanya dicipta sekali. Corak ini melibatkan pemeriksaan sama ada satu contoh tunggal sudah wujud sebelum mencipta yang baharu. Walau bagaimanapun, tanpa penyegerakan yang betul, ini boleh membawa kepada keadaan perlumbaan di mana berbilang benang boleh cuba mencipta singleton secara serentak.
Untuk menangani isu ini, kata kunci yang tidak menentu digunakan. Kata kunci yang tidak menentu memastikan pembolehubah contoh kelihatan kepada semua urutan, walaupun jika satu utas mengubahnya. Ini menghalang urutan daripada melihat contoh yang dibina separa.
Penjelasan Penggunaan Meruap
Dalam contoh kod yang diberikan, pembolehubah contoh diisytiharkan sebagai tidak menentu kerana ia adalah dikongsi di antara berbilang benang. Apabila Thread A memulakan pembolehubah instance, ia memberikan ruang memori kepadanya. Walau bagaimanapun, Thread B mungkin melihat tugasan ini dan cuba menggunakan contoh sebelum Thread A selesai membinanya.
Tanpa kata kunci yang tidak menentu, Thread B dapat melihat tugasan kepada contoh tetapi bukan pembinaan berikutnya. Ini akan mengakibatkan Benang B menggunakan contoh yang dibina separa, yang membawa kepada ralat. Kata kunci yang tidak menentu memastikan bahawa Thread B melihat nilai contoh yang paling terkini, termasuk sebarang pengubahsuaian yang dibuat oleh Thread A.
Menangani Isu Prestasi
Sesetengah mungkin berpendapat bahawa penggunaan tidak menentu mengalahkan tujuan penguncian yang disemak dua kali, iaitu untuk meningkatkan prestasi dengan mengelakkan penyegerakan yang tidak perlu. Walau bagaimanapun, penggunaan volatile adalah penting untuk menjamin keselamatan benang dan mengelakkan keadaan perlumbaan.
Pada hakikatnya, overhed prestasi penggunaan volatile biasanya boleh diabaikan, terutamanya berbanding kos penyegerakan keseluruhan kaedah. Seni bina perkakasan moden melaksanakan halangan memori yang memastikan bahawa sebarang penulisan kepada pembolehubah tidak menentu dapat dilihat kepada urutan lain tepat pada masanya.
Atas ialah kandungan terperinci Adakah Menggunakan Meruap dengan Penguncian Disemak Dua Kali Menyelesaikan Isu Keselamatan Benang dalam Penciptaan Singleton?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!