單例模式
? ??私有的類構(gòu)造器
? ??持有自己類型的屬性
? ??對(duì)外提供獲取實(shí)例的靜態(tài)方法
1、懶漢模式
線程不安全,延遲初始化
public class SingletonDemo {
????????private static SingletonDemo singletonDemo;
????????private SingletonDemo(){}
????????public static SingletonDemo getInstence(){
????????????????if(singletonDemo == null){
????????????????????????singletonDemo = new SingletonDemo();
? ? ? ? ? ? ? ?}?
???????????????return singletonDemo;
????????}
}
2、餓漢模式
線程安全,容易產(chǎn)生垃圾,一開始就初始化
public class SingletonDemo {
????????private static SingletonDemosingletonDemo =new SingletonDemo();
????????private SingletonDemo(){};
????????public static SingletonDemo getInstence(){
????????????????return singletonDemo;
????????}
}
3、雙重鎖模式
線程安全,延遲初始化,安全在多線程情況下保持高性能,雙重鎖模式,進(jìn)行了兩次判斷,第一次是為了避免不要的實(shí)例,第二次是進(jìn)行同步,避免多線程問題。
public class SingletonDemo {
????????private static SingletonDemo singletonDemo;
????????private SingletonDemo(){}
????????public static SingletonDemo getInstence(){
????????????????if(singletonDemo == null){
????????????????????????synchronized (SingletonDemo.class){
????????????????????????????????if (singletonDemo == null){
????????????????????????????????????????singletonDemo = new SingletonDemo();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
????????????????????????}
????????????}
????????????return singletonDemo;
????}
}
4、靜態(tài)內(nèi)部類單例模式
只有第一次調(diào)用getInstence()方法時(shí),虛擬機(jī)才會(huì)加載Inner,并初始化singletonDemo,
只有一個(gè)線程可以獲得對(duì)象的初始化鎖,其它線程無法進(jìn)行初始化,保證對(duì)象的唯一性,
public class SingletonDemo {
????????private SingletonDemo(){};
????????public static SingletonDemo getInstence(){
????????return Inner.singletonDemo;
????????}
????????private static class Inner{
????????????????private static SingletonDemosingletonDemo =new SingletonDemo();
????????}
}
5、枚舉單例模式
默認(rèn)枚舉實(shí)例的創(chuàng)建是線程安全的,并且在任何情況下都是單例。
枚舉類隱藏了私有的構(gòu)造器
枚舉類的域 是相應(yīng)類型的一個(gè)實(shí)例對(duì)象
public enum SingletonDemo{
????????INSTENCE;
????public static SingletonDemo getInstence(){
????????return SingletonDemo.INSTENCE;
????}
}