系列文章目錄
單例模式之靜態(tài)內部類
單例模式之枚舉方式
單例模式之JDK源碼分析
前言
Hello,小伙伴們,歡迎來到柚子的博客~讓我們一起成長吧o( ̄▽ ̄)ブ
提示:以下是本篇文章正文內容,下面案例可供參考
一、單例—靜態(tài)內部類
1.靜態(tài)內部類案例
代碼如下(示例):
//靜態(tài)內部類完成
class Singleton {
private static volatile Singleton instance;
//構造器私有化
private Singleton() {}
//寫一個靜態(tài)內部類,該類中有一個靜態(tài)屬性 Singleton
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
//提供一個靜態(tài)的公有方法,直接返回SingletonInstance.INSTANCE
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
類被裝載的時候,類里面的靜態(tài)內部類也是會被裝載的,而且線程是安全的
特點:
(1)當外部類被裝載的時候,靜態(tài)內部類也會被裝載。
(2)當靜態(tài)內部類在調 getInstance方法時,會導致靜態(tài)內部類的裝載,而且只會裝載一次,而且裝載的時候線程是安全的,所以可以達到懶加載+安全的效果。
(3)final方法進內嵌,但是方法太大的時候反而會降低性能,在裝載類的時候,使用了jvm底層提供的裝載機制,保證了初始化是安全的。
2.靜態(tài)內部類優(yōu)缺點
(1)這種方式采用了類裝載的機制來保證初始化實例時只有一個線程。
(2)靜態(tài)內部類方式在Singleton類被裝載時并不會立即實例化,而且在需要實例化時,調用getInstance方法,才會裝載SingletonInstance類,從而完成Singleton的實例化。
(3)類的靜態(tài)屬性只會在第一次加載類的時候初始化,所以在這里,JVM幫助我們保證了線程的安全性,在類進行初始化時,別的線程是無法進入的。
(4)優(yōu)點:避免了線程不安全,利用靜態(tài)內部類特點實現延遲加載,效率高。
(5)缺點:會造成內存浪費。
(6)結論:推薦使用。
二、單例—枚舉方式
1.枚舉方式案例
代碼如下(示例):
public class SingletonTest08 {
public static void main(String[] args) {
Singleton instance = Singleton.INSTANCE;
Singleton instance2 = Singleton.INSTANCE;
System.out.println(instance == instance2);
System.out.println(instance.hashCode());
System.out.println(instance2.hashCode());
}
}
enum Singleton {
INSTANCE;//屬性
public void sayOk() {
System.out.println("ok~");
}
}
(1)這是一個枚舉系統(tǒng),里面定義了一個INSTANCE的屬性,那這里面也可以提供相應的方法。
(2)枚舉類型中的每個屬性的類型都是枚舉類型的,因此每個屬性都是一個單例
使用枚舉,可以實現單例。
2.枚舉方式優(yōu)缺點
(1)這借助JDK1.5中添加的枚舉來實現單例模式。不僅能避免多線程同步問題,而且還能防止反序列化重新創(chuàng)建新的對象。
(2)這種方式是Effective Java作者Josh Bloch提倡的方式。
(3)結論:推薦使用。
三、單例—JDK源碼分析
1.JDK源碼分析
在我們JDK中,java.lang.Runtime就是經典的單例模式
靜態(tài)屬性:currentRuntime
靜態(tài)方法:getRuntime(),把事先創(chuàng)建好的currentRuntime返回
構造方法:Runtime(),私有化
使用的是單例模式中的餓漢式,上來就進行創(chuàng)建,避免了多線程的問題。
四、單例模式注意事項和細節(jié)說明
(1)單例模式保證了系統(tǒng)內存中該類只存在一個對象,節(jié)省了系統(tǒng)資源,對于一些需要頻繁創(chuàng)建銷毀的對象,使用單例模式可以提高系統(tǒng)性能。
(2)當想實例化一個單例類的時候,必須要記住使用相應的獲取對象的方法,而不是使用new。
(3)單例模式使用的場景:需要頻繁的進行創(chuàng)建和銷毀的對象、創(chuàng)建對象時耗時過多或耗費資源過多(即:重量級對象),但又經常用到的對象、工具類對象、頻繁訪問數據庫或文件的對象(比如數據源、session工廠等)
總結
單例模式之靜態(tài)內部類——推薦使用
單例模式之枚舉方式——推薦使用文章來源:http://www.zghlxwxcb.cn/news/detail-489458.html
╭?? ? ??╮
( ????? ?? )感覺有用的話,歡迎點贊評論呀!
╰?? ? ??╯文章來源地址http://www.zghlxwxcb.cn/news/detail-489458.html
到了這里,關于Java設計模式(八)— 單例模式3的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!