最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

應(yīng)用場(chǎng)景

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

2.單例模式的寫(xiě)法

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

1.懶漢式

2.餓漢式

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

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

5.枚舉

2.1單例模式的餓漢式

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

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

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

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

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

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

2.2單例模式的懶漢式

2.2.1 懶漢式普通寫(xiě)法

線程不安全,不推薦使用

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

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

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

2.2.2懶漢式同步代碼寫(xiě)法

【給創(chuàng)建對(duì)象的語(yǔ)句加鎖】與2.2.1的寫(xiě)法類(lèi)似仍為線程不安全的寫(xiě)法,不推薦使用

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相類(lèi)似,synchronized (Singleton.class) 鎖住的只是對(duì)于對(duì)象的創(chuàng)建,仍有有可能再線程1獲得”鑰匙“還未進(jìn)行對(duì)象的創(chuàng)建的時(shí)候,線程二也通過(guò)條件判斷進(jìn)行鎖等待,一旦獲得“鑰匙”也會(huì)進(jìn)行對(duì)象創(chuàng)建,也是會(huì)導(dǎo)致多對(duì)象的創(chuàng)建。

2.2.3懶漢式同步方法寫(xiě)法

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

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):效率太低了,每個(gè)線程在想獲得類(lèi)的實(shí)例時(shí)候,執(zhí)行g(shù)etInstance()方法都要進(jìn)行同步,方法進(jìn)行同步效率太低。

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

推介使用

public class Singleton {
	/**
	 * 懶漢式變種,屬于懶漢式中最好的寫(xiě)法,保證了:延遲加載和線程安全
	 */
	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;  
	}
}

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

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

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

2.3內(nèi)部類(lèi)

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

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

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

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

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

無(wú)法進(jìn)入的。

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

2.4枚舉

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

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

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

總結(jié)

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

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

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

相關(guān)文章

  • Spring?Boot項(xiàng)目集成Knife4j接口文檔的實(shí)例代碼

    Spring?Boot項(xiàng)目集成Knife4j接口文檔的實(shí)例代碼

    Knife4j就相當(dāng)于是swagger的升級(jí)版,對(duì)于我來(lái)說(shuō),它比swagger要好用得多<BR>,這篇文章主要介紹了Spring?Boot項(xiàng)目集成Knife4j接口文檔的示例代碼,需要的朋友可以參考下
    2021-12-12
  • Java volatile關(guān)鍵字特性講解上篇

    Java volatile關(guān)鍵字特性講解上篇

    JMM要求保證可見(jiàn)性、原子性、有序性,volatile可以保證其中的兩個(gè),本篇文章具體驗(yàn)證volatile的可見(jiàn)性,不原子性和禁重排,同時(shí)解決volatile的不保證原子性,讓代碼具有原子性
    2022-12-12
  • Java中如何正確遍歷刪除List中的元素

    Java中如何正確遍歷刪除List中的元素

    刪除List中元素這個(gè)場(chǎng)景很場(chǎng)景,很多人可能直接在循環(huán)中直接去刪除元素,這樣做對(duì)嗎?下面小編就來(lái)和大家一起討論如何正確遍歷刪除List中的元素,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • 詳解java jinfo命令

    詳解java jinfo命令

    jinfo是jdk自帶的命令,用來(lái)查看jvm的配置參數(shù).通常會(huì)先使用jps查看java進(jìn)程的id,然后使用jinfo查看指定pid的jvm信息,需要的朋友可以參考下
    2021-06-06
  • java Spring 5 新特性函數(shù)式Web框架詳細(xì)介紹

    java Spring 5 新特性函數(shù)式Web框架詳細(xì)介紹

    正如昨天Juergen博客中所提到的,Spring 5.0的第二個(gè)里程碑是引入了一個(gè)新的函數(shù)式web框架。在這篇文章中,我們將給出關(guān)于這個(gè)框架的更多信息,,需要的朋友可以參考下
    2016-12-12
  • Java+Selenium實(shí)現(xiàn)控制瀏覽器的啟動(dòng)選項(xiàng)Options

    Java+Selenium實(shí)現(xiàn)控制瀏覽器的啟動(dòng)選項(xiàng)Options

    這篇文章主要為大家詳細(xì)介紹了如何使用java代碼利用selenium控制瀏覽器的啟動(dòng)選項(xiàng)Options的代碼操作,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-01-01
  • SpringBoot連接MYSQL數(shù)據(jù)庫(kù)并使用JPA進(jìn)行操作

    SpringBoot連接MYSQL數(shù)據(jù)庫(kù)并使用JPA進(jìn)行操作

    今天給大家介紹一下如何SpringBoot中連接Mysql數(shù)據(jù)庫(kù),并使用JPA進(jìn)行數(shù)據(jù)庫(kù)的相關(guān)操作。
    2017-04-04
  • SpringBoot中請(qǐng)求參數(shù)綁定及使用詳解

    SpringBoot中請(qǐng)求參數(shù)綁定及使用詳解

    這篇文章主要介紹了SpringBoot中請(qǐng)求參數(shù)綁定及使用詳解,在Web應(yīng)用程序中,請(qǐng)求參數(shù)綁定是非常重要的操作,Spring?Boot框架使得請(qǐng)求參數(shù)綁定變得非常簡(jiǎn)單,通過(guò)使用注解和預(yù)定義的類(lèi)可以輕松地實(shí)現(xiàn)此操作,需要的朋友可以參考下
    2023-08-08
  • 利用maven命令指定配置文件打包springboot項(xiàng)目

    利用maven命令指定配置文件打包springboot項(xiàng)目

    這篇文章主要介紹了利用maven命令指定配置文件打包springboot項(xiàng)目,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java簡(jiǎn)單實(shí)現(xiàn)用語(yǔ)音讀txt文檔方法總結(jié)

    java簡(jiǎn)單實(shí)現(xiàn)用語(yǔ)音讀txt文檔方法總結(jié)

    在本篇文章里小編給大家整理了關(guān)于java簡(jiǎn)單實(shí)現(xiàn)用語(yǔ)音讀txt文檔的詳細(xì)方法總結(jié),有需要的朋友們參考下。
    2019-06-06

最新評(píng)論

古蔺县| 荣昌县| 玛沁县| 清丰县| 泰宁县| 万盛区| 民权县| 体育| 兴安县| 九江县| 潼关县| 怀安县| 泊头市| 洞口县| 扎囊县| 红原县| 永和县| 比如县| 政和县| 恭城| 安平县| 会理县| 武冈市| 邳州市| 衡阳县| 华宁县| 博兴县| 锦屏县| 陇西县| 衡阳县| 清新县| 尉氏县| 阜南县| 中西区| 舒城县| 平山县| 平罗县| 枣阳市| 阜宁县| 镇雄县| 安乡县|