亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java設(shè)計(jì)模式之單例模式Singleton Pattern詳解

 更新時間:2023年12月04日 10:21:16   作者:制造bug的鍵盤鋼琴師  
這篇文章主要介紹了Java設(shè)計(jì)模式之單例模式Singleton Pattern詳解,一些常用的工具類、線程池、緩存,數(shù)據(jù)庫,數(shù)據(jù)庫連接池、賬戶登錄系統(tǒng)、配置文件等程序中可能只允許我們創(chuàng)建一個對象,這就需要單例模式,需要的朋友可以參考下

1.單例設(shè)計(jì)模式的設(shè)計(jì)思想與應(yīng)用場景

設(shè)計(jì)目的

避免因?yàn)閯?chuàng)建了多個實(shí)例造成資源的浪費(fèi),且多個實(shí)例由于多次調(diào)用容易導(dǎo)致結(jié)果出現(xiàn)錯誤,而使用單例模式能夠保證整個應(yīng)用中有且只有一個實(shí)例。

設(shè)計(jì)思想

(1)不允許其他程序用new對象: 因?yàn)閚ew就是開辟新的空間,在這里更改數(shù)據(jù)只是更改的所創(chuàng)建的對象的數(shù)據(jù),如果可以new的話,每一次new都產(chǎn)生一個對象,這樣肯定保證不了對象的唯一性。

(2)在該類中創(chuàng)建對象: 因?yàn)椴辉试S其他程序new對象,所以這里的對象需要在本類中new出來

(3)對外提供一個可以讓其他程序獲取該對象的方法

應(yīng)用場景

一些常用的工具類、線程池、緩存,數(shù)據(jù)庫,數(shù)據(jù)庫連接池、賬戶登錄系統(tǒng)、配置文件等程序中可能只允許我們創(chuàng)建一個對象。

2.單例模式的寫法

單例模式的寫法大的方面可以分為5種五種

1.懶漢式

2.餓漢式

3.雙重校驗(yàn)鎖

4.靜態(tài)內(nèi)部類

5.枚舉

2.1單例模式的餓漢式

public class Singleton {
		private static Singleton instance=new Singleton();
		//構(gòu)造器私有化,本身不可創(chuàng)建
		private Singleton(){
		}
		//定義一個獲取對象的方法
		public static Singleton getInstance(){
			 return instance;
		}
}

餓漢式的靜態(tài)代碼塊寫法

public class Singleton{
	private static Singleton  instance = null;
	static{
		 instance =  new Singleton();
	}
	private Singleton(){
	}
	public static  Singleton getInstance(){
		return instance;
	}
}

備注:兩種寫法的主要區(qū)別在于加載的時間點(diǎn)上,前者在于靜態(tài)常量顯示初始化之后,后者在與靜態(tài)代碼塊加載運(yùn)行的時候。

優(yōu)點(diǎn):餓漢式的寫法主要的優(yōu)勢在于實(shí)現(xiàn)方式簡單,在類加載的時候完成了對象的實(shí)例化,因此也可以有效避免線程問題。

缺點(diǎn):可能造成資源浪費(fèi)的情況,由于對象實(shí)例是在代碼加載過程中進(jìn)行的,只要代碼成功加載對象實(shí)例就會被創(chuàng)建導(dǎo)致內(nèi)存浪費(fèi)?!颈徽加玫膬?nèi)存是非常小的,所以也是推介可以使用的。】

2.2單例模式的懶漢式

2.2.1 懶漢式普通寫法

線程不安全,不推薦使用

public class Singleton {
 
	private static Singleton instance=null;
	
	private Singleton() {};
	
	public static Singleton getInstance(){
		
		if(instance==null){
			instance=new Singleton();
		}
		return instance;
	}
}

與餓漢式的寫法相比較,懶漢式主要是在對**getInstance()**方法調(diào)用的時候進(jìn)行實(shí)例化對象的操作,既用之再造,節(jié)省了內(nèi)存,故因此稱之為懶漢式。

懶漢式的普通寫法式存在線程安全問題的,總的來說也就是存在重復(fù)創(chuàng)建對象的風(fēng)險(xiǎn)。假設(shè)線程1進(jìn)來,通過if(instance==null)的條件判斷準(zhǔn)備運(yùn)行”insatance=new Singleton()“這條代碼前,又有線程2運(yùn)行,此時還沒有成功進(jìn)行Singleton對象實(shí)例的創(chuàng)建,if 的條件判斷仍然成立,線程2也會去執(zhí)行instance=new Singleton()這條語句,這樣就會導(dǎo)致多個Singleton對象被創(chuàng)建。這就是為什么懶漢式的普通寫法會造成線程安全的原因。

2.2.2懶漢式同步代碼寫法

【給創(chuàng)建對象的語句加鎖】與2.2.1的寫法類似仍為線程不安全的寫法,不推薦使用

public class Singleton7 {
 
	private static Singleton instance=null;
	
	public static Singleton getInstance() {
		if (instance == null) {
			synchronized (Singleton.class) {
				instance = new Singleton();
			}
		}
		return instance;
	}
}

與2.2.1相類似,synchronized (Singleton.class) 鎖住的只是對于對象的創(chuàng)建,仍有有可能再線程1獲得”鑰匙“還未進(jìn)行對象的創(chuàng)建的時候,線程二也通過條件判斷進(jìn)行鎖等待,一旦獲得“鑰匙”也會進(jìn)行對象創(chuàng)建,也是會導(dǎo)致多對象的創(chuàng)建。

2.2.3懶漢式同步方法寫法

線程安全,但效率非常低,不推薦使用

public class Singleton {
 
	private static Singleton instance=null;
	
	private Singleton() {};
	
	public static synchronized Singleton getInstance(){
		
		if(instance==null){
			instance=new Singleton();
		}
		return instance;
	}
}

缺點(diǎn):效率太低了,每個線程在想獲得類的實(shí)例時候,執(zhí)行g(shù)etInstance()方法都要進(jìn)行同步,方法進(jìn)行同步效率太低。

2.2.4單例模式懶漢式雙重校驗(yàn)鎖

推介使用

public class Singleton {
	/**
	 * 懶漢式變種,屬于懶漢式中最好的寫法,保證了:延遲加載和線程安全
	 */
	private static Singleton instance=null;
	private Singleton() {};
	public static Singleton getInstance(){
		 if (instance == null) {  
	          synchronized (Singleton.class) {  
	              if (instance == null) {  
	            	  instance = new Singleton();  
	              }  
	          }  
	      }  
	      return instance;  
	}
}

通過雙層if(insatance==null)的條件限制,防止了多線程運(yùn)行就算在解鎖條件下多對象的創(chuàng)建。

通過synchronized 保證了線程安全,但再第一次對象成功創(chuàng)建后,就可以通過return instance 避免了加鎖代碼的重復(fù)運(yùn)行,大大提升了效率。

在線程安全以及效率之間找到了一個平衡點(diǎn)。

2.3內(nèi)部類

public class Singleton{
	private Singleton() {};
	private static class SingletonHolder{
		private static Singleton instance=new Singleton();
	} 
	public static Singleton getInstance(){
		return SingletonHolder.instance;
	}
}

這種方式跟餓漢式方式采用的機(jī)制類似,但又有不同。兩者都是采用了類裝載的機(jī)制來保證初始化實(shí)例時只有一個線程。不同

的地方在餓漢式方式是只要Singleton類被裝載就會實(shí)例化,沒有Lazy-Loading的作用,而靜態(tài)內(nèi)部類方式在Singleton類被裝載時

并不會立即實(shí)例化,而是在需要實(shí)例化時,調(diào)用getInstance方法,才會裝載SingletonHolder類,從而完成Singleton的實(shí)例化。

類的靜態(tài)屬性只會在第一次加載類的時候初始化,所以在這里,JVM幫助我們保證了線程的安全性,在類進(jìn)行初始化時,別的線程是

無法進(jìn)入的。

優(yōu)點(diǎn):避免了線程不安全,延遲加載,效率高。

2.4枚舉

public enum SingletonEnum {
	 instance; 
	 private SingletonEnum() {}
	 public void method(){
	 }
}

也就是直接將枚舉類Enum直接當(dāng)作一個上述例子中的Singleton所對應(yīng)的實(shí)例去進(jìn)行使用,可以直接通過SingletonEnum.instance.method();的方式對實(shí)例中我們要使用的方法進(jìn)行調(diào)用。

不僅能避免多線程同步問題,而且還能防止反序列化重新創(chuàng)建新的對象。可能是因?yàn)槊杜e在JDK1.5中才添加,所以在實(shí)際項(xiàng)目開發(fā)中,很少見人這么寫過,這種方式也是最好的一種方式,如果在開發(fā)中JDK滿足要求的情況下建議使用這種方式。

總結(jié)

對于寫法的選擇,開源項(xiàng)目也是采用的單例模式懶漢式雙重校驗(yàn)鎖這種寫法,其實(shí)最安全的寫法是枚舉,它的實(shí)現(xiàn)非常簡單而且最安全可謂很完美,但是可能是因?yàn)橹С值腏DK版本有限又或者是因?yàn)槊杜e大家不熟悉所以目前使用的人并不多,可以更多的進(jìn)行嘗試。

另外當(dāng)我們使用反射機(jī)制時可能不能保證實(shí)例的唯一性,但是枚舉始終可以保證唯一性【這與枚舉類在初始類加載的過程以及進(jìn)行的操作有關(guān)】。

到此這篇關(guān)于Java設(shè)計(jì)模式之單例模式Singleton Pattern詳解的文章就介紹到這了,更多相關(guān)Java單例模式Singleton Pattern內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用SpringBoot_jar方式啟動并配置日志文件

    使用SpringBoot_jar方式啟動并配置日志文件

    這篇文章主要介紹了使用SpringBoot_jar方式啟動并配置日志文件操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Tomcat 實(shí)現(xiàn)WebSocket詳細(xì)介紹

    Tomcat 實(shí)現(xiàn)WebSocket詳細(xì)介紹

    這篇文章主要介紹了Tomcat 如何實(shí)現(xiàn)WebSocket的相關(guān)資料,對WebSocket協(xié)議通信的過程進(jìn)行了詳細(xì)介紹,需要的朋友可以參考下
    2016-12-12
  • Windows下使用Graalvm將Springboot應(yīng)用編譯成exe大大提高啟動和運(yùn)行效率(推薦)

    Windows下使用Graalvm將Springboot應(yīng)用編譯成exe大大提高啟動和運(yùn)行效率(推薦)

    這篇文章主要介紹了Windows下使用Graalvm將Springboot應(yīng)用編譯成exe大大提高啟動和運(yùn)行效率,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • String的兩種初始化方法講解

    String的兩種初始化方法講解

    今天小編就為大家分享一篇關(guān)于String的兩種初始化方法講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 基于Spring中各個jar包的作用及依賴(詳解)

    基于Spring中各個jar包的作用及依賴(詳解)

    下面小編就為大家?guī)硪黄赟pring中各個jar包的作用及依賴(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 詳解SpringMVC的兩種實(shí)現(xiàn)方式

    詳解SpringMVC的兩種實(shí)現(xiàn)方式

    這篇文章主要介紹了SpringMVC的兩種實(shí)現(xiàn)方式,方式一是通過實(shí)現(xiàn)Controller接口,方式二是使用注解開發(fā),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • Java實(shí)現(xiàn)線程同步方法及原理詳解

    Java實(shí)現(xiàn)線程同步方法及原理詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)線程同步方法及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • springboot項(xiàng)目中的bootstrap.yml配置不生效的原因及解決(沒有自動提示)

    springboot項(xiàng)目中的bootstrap.yml配置不生效的原因及解決(沒有自動提示)

    新創(chuàng)建一個 springboot項(xiàng)目,添加了 bootstrap.yml 文件,發(fā)現(xiàn)文件并沒有如預(yù)期變成綠色葉子,編寫的時候也沒有自動提示,啟動的時候,發(fā)現(xiàn)端口是8080,由此發(fā)現(xiàn)配置并沒有生效,所以本文給大家講解了springboot項(xiàng)目中的bootstrap.yml配置不生效的原因及解決
    2024-01-01
  • 基于Spring AOP proxyTargetClass的行為表現(xiàn)總結(jié)

    基于Spring AOP proxyTargetClass的行為表現(xiàn)總結(jié)

    這篇文章主要介紹了Spring AOP proxyTargetClass的行為表現(xiàn)總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 讓Java程序自動重啟的實(shí)現(xiàn)方法(推薦)

    讓Java程序自動重啟的實(shí)現(xiàn)方法(推薦)

    下面小編就為大家?guī)硪黄孞ava程序自動重啟的實(shí)現(xiàn)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03

最新評論