Ya, itu perlu. Ada beberapa metode yang dapat Anda gunakan untuk mencapai keamanan thread dengan inisialisasi yang lambat:
Sinkronisasi draconian:
private static YourObject instance;
public static synchronized YourObject getInstance() {
if (instance == null) {
instance = new YourObject();
}
return instance;
}
Solusi ini mengharuskan setiap utas disinkronkan ketika pada kenyataannya hanya beberapa utas yang perlu disinkronkan.
Periksa kembali sinkronisasi :
private static final Object lock = new Object();
private static volatile YourObject instance;
public static YourObject getInstance() {
YourObject r = instance;
if (r == null) {
synchronized (lock) { // While we were waiting for the lock, another
r = instance; // thread may have instantiated the object.
if (r == null) {
r = new YourObject();
instance = r;
}
}
}
return r;
}
Solusi ini memastikan bahwa hanya beberapa utas pertama yang mencoba memperoleh tunggal Anda yang harus melalui proses memperoleh kunci.
Inisialisasi sesuai Permintaan :
private static class InstanceHolder {
private static final YourObject instance = new YourObject();
}
public static YourObject getInstance() {
return InstanceHolder.instance;
}
Solusi ini memanfaatkan jaminan model memori Java tentang inisialisasi kelas untuk memastikan keamanan thread. Setiap kelas hanya dapat dimuat sekali, dan hanya akan dimuat saat diperlukan. Artinya, pertama kali getInstance
dipanggil, InstanceHolder
akan dimuat dan instance
akan dibuat, dan karena ini dikontrol oleh ClassLoader
s, tidak diperlukan sinkronisasi tambahan.