一、.單例模式
1.三要素:
私有化構(gòu)造器
類內(nèi)創(chuàng)建對(duì)象
對(duì)外提供獲取對(duì)象的public方法
2.餓漢式
類的初始化時(shí)乞榨,構(gòu)建靜態(tài)屬性對(duì)象藕赞,或在靜態(tài)塊中創(chuàng)建對(duì)象,由于類的加載只有一次亿遂,所以餓漢式是天然線程安全的浓若,但是由于初始化類就加載對(duì)象,可能會(huì)造成內(nèi)存浪費(fèi)蛇数。
3.懶漢式(方法加synchronized挪钓,線程安全)
getInstance()方法內(nèi)創(chuàng)建對(duì)象,由于方法被同步耳舅,可以確保線程安全碌上,可用,但是影響效率浦徊。
4.雙重檢查
配合volatile關(guān)鍵字馏予,確保屬性(對(duì)象)對(duì)多線程具有可見性。
懶漢式盔性,getInstance()方法內(nèi)加synchronized同步塊吗蚌,線程安全,雙重檢查確保效率纯出。
public class SafeDoubleCheckedLocking {
? ? ? ? private volatile static Instance instance;
??????? private SafeDoubleCheckedLocking (){
??????? }
? ? ? ? public? static Instance getInstance(){
? ? ? ? ?? if(instance ==null) {
? ? ? ? ? ? ? synchronized (SafeDoubleCheckedLocking.class) {
? ? ? ? ? ? ? ? ? if (instance == null)
? ? ? ? ? ? ? ? ? ?? instance = new Instance();
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? return instance;
? ? ? ? }
}
5.靜態(tài)內(nèi)部類
說明:
主類加載時(shí)蚯妇,靜態(tài)內(nèi)部類不加載--實(shí)現(xiàn)懶加載
調(diào)用getInstance方法時(shí),靜態(tài)內(nèi)部類加載暂筝,類的加載是天然線程安全的--實(shí)現(xiàn)線程安全
public class Singleton {
private Singleton(){
//構(gòu)造器私有化
? ? }
private static class SingletonInstance{
//類的內(nèi)部創(chuàng)建對(duì)象
? ? ? ? private static final SingletonINSTANCE =new Singleton();
}
public static Singleton getInstance() {
//獲取對(duì)象的public方法
? ? ? ? return SingletonInstance.INSTANCE;
}
}
6.枚舉
所有枚舉對(duì)象都是單例的
7.實(shí)際應(yīng)用舉例:
1)springboot框架中箩言,@Component+@Autowired注解,可以確保單例焕襟;
如果直接new對(duì)象(可以new)陨收,那就不單例了(new出來的對(duì)象不是spring管理的)
2)@Configuration+@Bean,對(duì)象也受spring管理,因此是單例的