Dalam program Java, kadang-kadang mungkin perlu untuk menunda beberapa operasi inisialisasi objek tinggi dan hanya diinisialisasi saat menggunakan objek ini. Ini disebut inisialisasi tertunda atau pemuatan malas
Lihatlah inisialisasi penundaan yang tidak aman:
Setelah utas A mengeksekusi 1, ia menemukan bahwa instance objek nol dan siap untuk itu baru, sedangkan Thread B adalah baru pertama, yang menyebabkan kesalahan.
Kami dapat menggunakan kunci sinkronisasi untuk memastikan kebenaran:
Tetapi menyinkronkan seluruh metode terlalu mahal, dan orang -orang datang dengan penguncian cek ganda:
Kunci sinkronisasi yang digunakan dalam kisaran minimum tampaknya mencapai tujuan menggunakan pengecekan ganda, tetapi ini memiliki masalah: ketika menjalankan utas 4, Thread B's 7 belum dieksekusi, dan utas A menentukan contoh! = NULL. Thread B's 7 belum dieksekusi, jadi mengapa ini terjadi?
Lihatlah implementasi utama yang mendasari dari instance baru ():
Bahkan, ini adalah untuk melakukan 1 mengalokasikan memori pertama, kemudian menginisialisasi objek dan mengatur instance. Lalu ada pemesanan ulang di sini, dan urutan 2 dan 3 dapat diganti:
Jadi ketika B masih mengeksekusi 7, A menentukan pada 4 bahwa objek instan telah diinisialisasi. Jika instance dipanggil sebelum ctorinstance (memori) akan menyebabkan kesalahan.
Ada dua solusi:
1. Deklarasikan objek instan sebagai volatile, itu akan melarang penataan ulang 2 dan 3
2. Menggunakan solusi berdasarkan inisialisasi kelas: JVM akan melakukan inisialisasi kelas pada tahap inisialisasi kelas (yaitu, setelah kelas dimuat dan sebelum digunakan oleh utas). ada
Selama inisialisasi kelas eksekusi, JVM akan memperoleh kunci. Kunci ini dapat menyinkronkan inisialisasi kelas yang sama dengan beberapa utas
Kami akan menemukan bahwa kode implementasi skema berdasarkan inisialisasi kelas lebih sederhana. Tetapi skema penguncian pemeriksaan ganda yang didasarkan pada volatil memiliki keuntungan tambahan: Selain menunda inisialisasi bidang statis, ia juga dapat menunda inisialisasi bidang instance. Inisialisasi penundaan lapangan mengurangi overhead kelas inisialisasi atau membuat instance, tetapi meningkatkan overhead mengakses bidang yang tertunda diinisialisasi. Sebagian besar waktu, inisialisasi normal lebih baik daripada inisialisasi tertunda. Jika Anda benar-benar perlu menggunakan inisialisasi akhir yang aman-aman untuk bidang-bidang instan, silakan gunakan skema inisialisasi penundaan berbasis volatile yang dijelaskan di atas; Jika Anda benar-benar perlu menggunakan inisialisasi akhir yang aman-aman untuk bidang statis, silakan gunakan skema inisialisasi berbasis kelas yang dijelaskan di atas.
Meringkaskan
Di atas adalah kode implementasi kunci periksa ganda Java yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!