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

Java設(shè)計模式之單件模式深入講解

 更新時間:2021年11月08日 16:18:14   作者:不俠居  
有人說單件模式是最簡單的模式,因為它只有一個類,但其實它還有一些值得注意的地方,就如:出現(xiàn)并發(fā)性時,單件可能已經(jīng)不是單件了

定義

單件模式確保一個類只有一個實例,并提供一個全局訪問點

Java單件模式

經(jīng)典單件模式的實現(xiàn)

public class Singleton{
	private static Singleton uniqueInstance; // 利用一個靜態(tài)變量來記錄Singleton類的唯一實例
	private Singleton(){} // 把構(gòu)造器聲明為私有的,只有自Singleton類內(nèi)才可以調(diào)用構(gòu)造器
	// 用getInstance()方法實例化對象,并返回這個實例
	public static Singleton getInstance(){
		if (uniqueInstance == null){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
}

在多線程中以上代碼會生成多個實例,所以需要我們對代碼進行改進

多線程單件模式的實現(xiàn)

public  class Singleton{
	private static Singleton uniqueInstance;

	private Singleton(){}

	public static synchronized Singleton getInstance(){
		if(uniqueInstance == null){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
}

通過增加synchronized關(guān)鍵字到getInstance()方法中,我們迫使每個線程在進入這個方法之前,要先等候別的線程離開該方法。也就是說,不會有兩個線程可以同時進入這個方法。

急切創(chuàng)建實例

public class Singleton{
	// 在靜態(tài)初始化器(static initializai)中創(chuàng)建單件。這樣可以保證線程安全(thread sate)
	private static Singleton uniqueInstance = new Singleton();

	private static Singleton getInstance(){
		return uniqueInstance;
	}
	
}

在JVM在加載這個類時馬上創(chuàng)建此唯一的單件實例。JVM保證在任何線程訪問uniqueInstance靜態(tài)變量之前,一定創(chuàng)建此實例。

雙重檢查加鎖

會有兩次檢查實例是否存在,若不存在則創(chuàng)建實例,若存在則返回

public class Singlenton{
	// volatile關(guān)鍵詞:當uniqueInstance變量被初始化成Singleton實例時,多個線程正確地處理uniqueInstance變量
	private volatile static Singleton uniqueInstance();
	
	private Singleton(){}

	public static Singleton getInstance(){
		// 檢查實例,如果不存在,就進入同步區(qū)塊
		if(uniqueInstance == null){
			// 進入?yún)^(qū)塊后,再檢查一次。如果仍是null,才創(chuàng)建實例
			synchronized (Singleton.class){
				if(uniqueInstance == null){
					uniqueInstance = new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}

Python單件模式

模塊實現(xiàn)

Python 的模塊就是天然的單件模式,在模塊第一次被導(dǎo)入時,會生成.pyc文件,之后再次導(dǎo)入時,就會直接加載之前生成的.pyc文件,不會再次執(zhí)行模塊代碼
先創(chuàng)建一個Singleton文件

class Singleton:
	def getSingleton:
		pass
singleton = Singleton()

在其他文件中導(dǎo)入這個模塊,這個類的地址是唯一的

new關(guān)鍵字實現(xiàn)

當實例化一個對象時,先調(diào)用類的__new__方法 ,默認調(diào)用的是父類Object.__new__方法,實例化對象。然后再調(diào)用類的__init__方法進行屬性的初始化。
我們可以再__new__方法內(nèi)加一個判斷,若實例存在,則不實例化,若不存在,則實例化。

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = object.__new__(cls, *args, **kwargs)
        return cls._instance
    def __init__(self):
        pass

裝飾器實現(xiàn)

通過裝飾器來實現(xiàn)單件模式

函數(shù)裝飾器

def singleton(cls):
	# 創(chuàng)建一個私有變量,類型為字典,用來存放類地址的
    _instance = {}

    def inner():
    	# 如果類不存在
        if cls not in _instance:
        	# 實例化一個類并存放在字典里
            _instance[cls] = cls()
        return _instance[cls]
    return inner
    
@singleton
class ClassName(object):
    def __init__(self):
        pass

類裝飾器

class Singleton(object):
    def __init__(self, cls):
        self._cls = cls # 接受類名
        self._instance = {} # 存放類地址
    def __call__(self):
        if self._cls not in self._instance:
        	# 實例化類并存放在字典內(nèi)
            self._instance[self._cls] = self._cls()
        return self._instance[self._cls]

@Singleton
class ClassName(object):
    def __init__(self):
        pass

以上就是Java設(shè)計模式之單件模式深入講解的詳細內(nèi)容,更多關(guān)于Java設(shè)計模式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring Boot文件上傳原理與實現(xiàn)詳解

    Spring Boot文件上傳原理與實現(xiàn)詳解

    這篇文章主要介紹了Spring Boot 文件上傳原理與實現(xiàn)詳解,前端文件上傳是面向多用戶的,多用戶之間可能存在上傳同一個名稱、類型的文件;為了避免文件沖突導(dǎo)致的覆蓋問題這些應(yīng)該在后臺進行解決,需要的朋友可以參考下
    2024-01-01
  • Java實現(xiàn)文件上傳下載以及查看功能

    Java實現(xiàn)文件上傳下載以及查看功能

    這篇文章主要為大家詳細介紹了java如何實現(xiàn)文件上傳和下載以及查看功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java應(yīng)用CPU使用率過高排查方式

    Java應(yīng)用CPU使用率過高排查方式

    這篇文章主要介紹了Java應(yīng)用CPU使用率過高排查方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java并發(fā)編程JUC CountDownLatch線程同步

    java并發(fā)編程JUC CountDownLatch線程同步

    這篇文章主要介紹CountDownLatch是什么、CountDownLatch 如何工作、CountDownLatch 的代碼例子來展開對java并發(fā)編程JUC CountDownLatch線程同步,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • Java實戰(zhàn)之酒店人事管理系統(tǒng)的實現(xiàn)

    Java實戰(zhàn)之酒店人事管理系統(tǒng)的實現(xiàn)

    這篇文章主要介紹了如何用Java實現(xiàn)酒店人事管理系統(tǒng),文中采用的技術(shù)有:JSP、Spring、SpringMVC、MyBatis等,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-03-03
  • SpringBoot動態(tài)生成接口實現(xiàn)流程示例講解

    SpringBoot動態(tài)生成接口實現(xiàn)流程示例講解

    最近遇到一個需求,需要在程序運行過程中,可以動態(tài)新增接口,自定義接口參數(shù)名稱,基本類型,以及請求方法,請求頭等等。通過幾天的研究,找到了我需要的解決方案
    2023-01-01
  • SpringBoot集成Redisson操作Redis的實現(xiàn)方法

    SpringBoot集成Redisson操作Redis的實現(xiàn)方法

    Redisson是一個用于Java的Redis客戶端,它提供了在分布式環(huán)境下操作Redis數(shù)據(jù)庫的簡單、高效的方式,本文主要介紹了SpringBoot集成Redisson操作Redis的實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • mybatis輸出SQL格式化方式

    mybatis輸出SQL格式化方式

    這篇文章主要介紹了mybatis輸出SQL格式化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • springboot2.x使用Jsoup防XSS攻擊的實現(xiàn)

    springboot2.x使用Jsoup防XSS攻擊的實現(xiàn)

    這篇文章主要介紹了springboot2.x使用Jsoup防XSS攻擊的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java中g(shù)etResourceAsStream用法分析

    Java中g(shù)etResourceAsStream用法分析

    這篇文章主要介紹了Java中g(shù)etResourceAsStream用法,較為詳細的分析了getResourceAsStream的功能及用法,需要的朋友可以參考下
    2015-06-06

最新評論

商丘市| 威海市| 南阳市| 罗山县| 巩义市| 太原市| 旺苍县| 渝中区| 克山县| 永嘉县| 始兴县| 鲁山县| 南京市| 鹤壁市| 蓝山县| 中西区| 馆陶县| 建瓯市| 吉林省| 丹巴县| 新郑市| 子长县| 涿州市| 沽源县| 司法| 霞浦县| 云阳县| 茂名市| 孝感市| 柳州市| 长兴县| 新巴尔虎左旗| 腾冲县| 石河子市| 柳州市| 繁峙县| 稻城县| 綦江县| 东乌| 宝清县| 拉萨市|