單例模式(詳細)

2021-10-05 04:37:35 字數 2964 閱讀 7380

b站學習做的筆記

單例模式就是採取一定的方法保證整個軟體

統裡面對於某個類只能存在乙個例項

並且該類只提供乙個取物件例項的方法(靜態方法)

餓漢式(靜態常量)

餓漢式(靜態**塊)

懶漢式(執行緒不安全)

懶漢式(執行緒安全 同步方法)

雙重檢查

靜態內部類 列舉

餓漢式的兩種寫法

1靜態常量

步驟

1. 構造器私有化(防止new )

2. 類的內部建立物件

3. 向類的外面暴露乙個靜態的公共方法getinstance

4. **實現

package com.設計模式.單例模式;

public class singleton1

}//餓漢式(靜態常量)

class singleton

//內部建立例項

private final static singleton singleton = new singleton();

//提供返回方法

public static singleton getinstance()

}

325040804

325040804

hascode相同

優缺點

寫法簡單 在類載入的時候完成例項化。避免執行緒同步的問題

缺點:在類載入的時候完成例項化 沒有達到 lazy loading 的效果 如果從來沒有使用這個例項 就會造成記憶體的浪費

這種方法基於classloder 機制避免了多執行緒 的同步問題 在instance 在類載入時候就例項化 在單例中大多是呼叫getinstance方法 但是導致類裝置的原因有很多 不能確定有其他的方式導致類裝載 這時候初始化instance 沒有達到lazy loading的效果

4 結論:這種方法可能會導致記憶體浪費.

靜態**塊

package com.設計模式.單例模式;

public class test

}class singleton2

static

public static singleton2 getinstance()

}

優缺點 同上

懶漢式1 執行緒不安全

package com.設計模式.單例模式;

public class test2

}class singletontest

//提供乙個靜態方法 用到方法再去建立instance

public static singletontest getinstance()

return instance;

}}

優缺點

1.起到了lazy loading 的效但是只能在單執行緒下使用

2 多執行緒下 乙個執行緒進入if 判斷 還未來得及向下執行 另乙個執行緒也進去判斷 這樣會產生多個例項 (多執行緒下不可使用)

2 執行緒安全

public class test 

}class singleton

//加入同步處理

public static synchronized singleton getinstance()

return instance;

}}

問題:

1 解決了執行緒不安全的問題

2 效率低了 執行緒要獲得例項的時候getinstance 都要同步

注: 如果在這使用同步**塊 起不到執行緒安全的作用

public class test 

}class singleton

public static singleton getinstance()}}

return singleton;

}}//物件建立可能指令重排,建立空間,指向空間,然後才初始化,volatile可保證有序,可見

這裡必須加volalite的原因:

new 物件的過程分為三步:   

1.分配空間

2.初始化物件

3.指向物件記憶體位址。2和3可能被編譯器自動重排,導致判斷非空但是實際拿的物件還未完成初始化

注: new 操作中初始化記憶體空間和指向 記憶體空間這兩步操

作會根據情況不同,執行順序不同,如果先

是指向記憶體空間執行,這時對

象不為空,另乙個執行緒有

可能進入並返回未初始化的物件

優缺點

1 double-check 保證執行緒的安全性

2 執行緒安全 延遲載入 效率較高

public class test 

}class singleton

private static class singletoninstance

public static singleton getinstance()

}

1 使用了類裝載的機制保證初始化例項只有乙個執行緒

2靜態內部類在類被裝載時候並不會立即例項化 而是在

需要例項化的時候呼叫getinstance() 才會裝載內部類完成例項化

3 類的靜態屬性在第一次載入類的時候會初始化 jvm

幫助我們保護l執行緒安全

4 利用靜態內部類實現延遲載入 效率高

public class test 

}enum singleton

}

避免多執行緒同步問題 還能防止反序列化重新建立新的物件

單例模式詳細案例

單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法 靜態方法 比如hibernate的sessionfactory,它充當資料儲存源的 並負責建立session物件。sessionfactory並不是輕量級的,一般情況下,乙個...

詳細解說單例模式

public class singleton public static singleton getinstance public class singleton private singleton public static singleton getinstance 優點 在類裝載的時候就完成了...

php單例模式詳細介紹

1 單例模式的概念 單例模式是指整個應用中某個類只有乙個物件例項的設計模式。具體來說,作為物件的建立方式。單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統全域性的提供這個例項。它不會建立例項副本,而是會向單例類內部儲存的例項返回乙個引用。2 單例模式的特點 單例模式的主要特點是 三私一公...