餓漢式(靜態常量) |
|
1、簡單 2、 在類裝載的時候完成實例化,避免了線程同步問題 |
1、初始化就加載,如果從始至終沒有用過這個實例,造成內存浪費 |
可用 |
java.lang.Runtime |
餓漢式(靜態代碼塊) |
|
同上 |
同上 |
可用 |
|
懶漢式(線程不安全) |
|
有了懶加載效果,但是隻能單線程使用 |
如果在多線程下,一個線程進入了 if (singleton == null)判斷語句塊,還未來得及往下執行,另一個線程也通過了這個判斷語句,這時便會產生多個實例 |
單線程可用 |
|
懶漢式(線程安全,同步方法) |
|
解決了線程安全問題 |
效率太低了,每個線程在想獲得類的實例時候,執行 getInstance()方法都要進行同步。而其實這個方法只執行一次實例化代碼就夠了,後面的想獲得該類實例,直接 return 就行了。方法進行同步效率太低 |
不推薦使用 |
|
懶漢式(線程安全,同步代碼塊) |
|
無 |
多線程可能出現多個實例 |
不推薦使用 |
|
雙重檢查 |
|
保證了懶加載 線程安全 效率高 |
無 |
推進使用 |
|
靜態內部類(效率高) |
|
採用了類裝載機制確保了線程安全問題,靜態內部類在實例初始化不會加載,達到了懶加載效果,靜態屬性只在實例第一次加載時初始化一次,保證了只會有一個實例 |
無 |
推進使用 |
|
枚舉 |
|
藉助jdk 加載枚舉的特點實現單例模式,不僅避免了線程問題,還能防止通過反序列化創建新的對象實例 |
無 |
推進使用 |
|