單例的特點
- 不能重復實例化,所以構造方法是空的,private
- 提供一個共有的靜態方法,調用取出單實例
- 要滿足線程安全
單例有幾種寫法,有餓漢懶漢之分
懶漢就是lazy load,在有被調用的時候,才初始化實例。缺點是,為了線程安全,方法會加鎖,性能上有浪費。
餓漢是在jvm加載的時候就已經初始化。缺點就是如果單例的類一直沒被調用,造成浪費資源。
以下列舉下推薦使用的幾種寫法。
餓漢模式:
package com.lxqn.jiapeng.design;
/**
* 餓漢
* Created by jiapeng on 2017/10/9.
*/
public class Singleton {
private Singleton() {};
private static final Singleton singleton = new Singleton();
public static Singleton getInstance(){
return singleton;
}
}
package com.lxqn.jiapeng.design;
/**
* 餓漢內部類
* Created by jiapeng on 2017/10/9.
*/
public class Singleton2 {
private Singleton2() {};
public static Singleton2 getInstance(){
return InnerClass.INSTANCE;
}
private static class InnerClass {
private static final Singleton2 INSTANCE = new Singleton2();
}
}
懶漢模式
package com.lxqn.jiapeng.design;
/**
* 懶漢
* Created by jiapeng on 2017/10/9.
*/
public class Singleton1 {
private Singleton1(){};
private static Singleton1 singleton=null;
public static synchronized Singleton1 getInstance(){
if(singleton == null){
singleton = new Singleton1();
}
return singleton;
}
}
package com.lxqn.jiapeng.design;
/**
* 懶漢雙重效驗
* Created by jiapeng on 2017/10/9.
*/
public class Singleton4 {
private Singleton4() {};
private static volatile Singleton4 INSTANCE;
public static Singleton4 getInstance() {
if (INSTANCE == null) {
synchronized(Singleton4.class){
if(INSTANCE == null) {
INSTANCE = new Singleton4();
}
}
}
return INSTANCE;
}
}