2.單例模式
題目:設計一個類,規定只能生成一個該類的實體,
普通解法,單執行緒環境下不會出錯,但是多執行緒環境下可能會出錯,
//單執行緒環境
public class Singleton1{
private static Singleton1() {
}
private static Singleton1 instance = null;
public static Singleton1 getInstance() {
if (instance == null) {
return new Singleton1();
}
}
}
//
上述解法多執行緒環境下可能會出錯:如果同時有兩個執行緒在同一時刻判斷了instance是否為null,則都為null,會生成2個實體, 針對上述問題修改為多執行緒環境中作業,
//先加鎖后判斷,但是加鎖開銷大,效率不高
public class Singleton2{
private static Singleton2() {
}
private static Singleton2 instance = null;
public static Singleton2 getInstance() {
synchronized (Singleton2.class){
if (instance == null) {
instance = new Singleton2();
}
}
return instance;
}
}
//由于加鎖的消耗較大,因此盡量避免加鎖的操作,在確定實體為空后,創建時加鎖
public class Singleton3{
private static Singleton3() {
}
private static Singleton3 instance = null;
public static Singleton3 getInstance() {
if (instance == null) {
synchronized (Singleton3.class){
instance == new Singleton3();
}
}
return instance;
}
}
使用靜態內部類,執行緒安全,
public class Singleton4{
//建構式私有化
private static Singleton(){
}
private static class SingletonHolder{
private static Singleton myInstance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.myInstance;
}
}
餓漢模式,直接生成,需要時呼叫即可,空間換時間,不存在執行緒安全的問題,
public class Singleton5{
private static Singleton5() {
}
private static Singleton5 instance = new Singleton5();
public static getInstance() {
return instance;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259857.html
標籤:其他
上一篇:Java記憶體模型
