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

Java單例的寫法詳解

 更新時間:2021年09月10日 11:05:06   作者:煢祇  
在java中,單例有很多種寫法,面試時,手寫代碼環(huán)節(jié),除了寫算法題,有時候也會讓手寫單例模式,這里記錄一下單例的幾種寫法和優(yōu)缺點。需要的朋友可以參考下

單例模式,顧名思義,就是全局只保存有一個實例并且能夠避免用戶去手動實例化,所以單例模式的各種寫法都有一個共同點,不能通過new關鍵字去創(chuàng)建對象,因此,如果能夠通過構造方法實例化,那么就一定要將其聲明為私有。

餓漢式

public class PersonResource {
    public static final PersonResource PERSON_RESOURCE_SINGLETON = new PersonResource();
    private PersonResource(){}
    public  static PersonResource getInstance() {
        return PERSON_RESOURCE_SINGLETON;
    }
}

這種方式可以說是最安全,也最簡單的了,但卻有一個缺點,那就是無論這個實例有沒有被使用到,都會被實例化,頗有些浪費資源

懶漢式一

既然前一種方法有些浪費資源,那就換一種寫法,讓類在被調(diào)用的時候?qū)嵗?/p>

public class PersonResource {
    private static PersonResource personResourceSingleton;
    private PersonResource() {
    }
    public static PersonResource getPersonResourceSingleton(){
        if(null==personResourceSingleton){
            personResourceSingleton = new PersonResource();
        }
        return personResourceSingleton;
    }
}

這種方式能夠在需要用到該實例的時候再初始化,也能夠在單線程下很好的運行,但如果是多線程就容易出現(xiàn)問題了。

懶漢式二

public class PersonResource {
    private static PersonResource personResourceSingleton;
    private PersonResource() {
    }
    public static PersonResource getPersonResourceSingleton(){
        if(null==personResourceSingleton){
            personResourceSingleton = new PersonResource();
        }
        return personResourceSingleton;
    }
}

多線程之所以會出現(xiàn)問題,是因為多個線程能夠并發(fā)執(zhí)行getPersonResourceSingleton方法,從而導致在判斷是否為空時出現(xiàn)問題。

既然如此,加上鎖 ,使其互斥即可。這里又出現(xiàn)了一個問題,每次獲取實例的時候都需要加鎖解鎖,而當一個實例已經(jīng)被產(chǎn)生后,再加鎖就有些多余了;

懶漢式三(雙重檢查)

public class PersonResource {
    private PersonResource(){    }
    private volatile static PersonResource personResource;
    public  static PersonResource getInstance(){
        if(personResource==null){
            synchronized (PersonResource.class){
                if(personResource==null){
                    personResource = new PersonResource();
                }
            }
        }
        return personResource;
    }
}

既然實例確定產(chǎn)生后不再需要加鎖,那我們在獲取鎖前先判斷一次是否已經(jīng)有實例存在就可以解決問題了

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

public class PersonResource {
    private PersonResource(){}
    private static class PersonResourceHolder{
        public static PersonResource personResourceSingleton = new PersonResource();
    }
    public static PersonResource getInstance(){
        return PersonResourceHolder.personResourceSingleton;
    }
}

除了雙重檢查能夠保證安全的單例外,用一個靜態(tài)內(nèi)部類去持有單例也是可以的,靜態(tài)內(nèi)部類保證了不會隨外部類的加載而加載,這保證了延遲加載,同時在加載該類的時候就實例化單例,保證了線程安全;

枚舉

public enum PersonResource {
    /**
     * PersonResource單例
     */
    personResource;
    public void setPersonResource(){
    }
}

以上幾種方式基本就夠用了,但都有一個共同的缺點,面對序列化和反序列化,是無法保證單例的,但枚舉的特性卻能保證這一點

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!

相關文章

  • Java數(shù)據(jù)結構之常見排序算法(上)

    Java數(shù)據(jù)結構之常見排序算法(上)

    這篇文章主要介紹了Java數(shù)據(jù)結構之常見排序算法,本文章是匯總篇,且對每個排序都進行了說明,可以很好的理清思路,對排序算法有個總體的框架,需要的朋友可以參考下
    2023-01-01
  • Spring Security整合Oauth2實現(xiàn)流程詳解

    Spring Security整合Oauth2實現(xiàn)流程詳解

    這篇文章主要介紹了Spring Security整合Oauth2實現(xiàn)流程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • VScode 打造完美java開發(fā)環(huán)境最新教程

    VScode 打造完美java開發(fā)環(huán)境最新教程

    這篇文章主要介紹了VScode 打造完美java開發(fā)環(huán)境最新教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java加載property文件配置過程解析

    Java加載property文件配置過程解析

    這篇文章主要介紹了java加載property文件配置過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java Applet查找素數(shù)小程序代碼實例

    Java Applet查找素數(shù)小程序代碼實例

    這篇文章主要介紹了Java Applet查找素數(shù)小程序代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java數(shù)據(jù)結構之優(yōu)先級隊列(堆)圖文詳解

    Java數(shù)據(jù)結構之優(yōu)先級隊列(堆)圖文詳解

    優(yōu)先級隊列是比棧和隊列更專用的結構,在多數(shù)情況下都非常有用,下面這篇文章主要給大家介紹了關于Java數(shù)據(jù)結構之優(yōu)先級隊列(堆)的相關資料,需要的朋友可以參考下
    2022-03-03
  • Quartz實現(xiàn)JAVA定時任務的動態(tài)配置的方法

    Quartz實現(xiàn)JAVA定時任務的動態(tài)配置的方法

    這篇文章主要介紹了Quartz實現(xiàn)JAVA定時任務的動態(tài)配置的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java +Tomcat + SpringMVC實現(xiàn)頁面訪問示例解析

    Java +Tomcat + SpringMVC實現(xiàn)頁面訪問示例解析

    這篇文章主要介紹了Java +Tomcat + SpringMVC實現(xiàn)頁面訪問示例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Spring Cloud Config工作原理概述

    Spring Cloud Config工作原理概述

    Spring Cloud Config 是 Spring Cloud 生態(tài)系統(tǒng)的一部分,它提供了一種集中化管理應用配置的方法,本文給大家介紹Spring Cloud Config工作原理概述,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Java通過關閉Socket終止線程

    Java通過關閉Socket終止線程

    這篇文章主要為大家詳細介紹了Java通過關閉Socket終止線程的相關代碼
    2017-04-04

最新評論

高平市| 亳州市| 乌兰察布市| 柏乡县| 宁夏| 镇安县| 隆子县| 福贡县| 辽宁省| 祁门县| 兴业县| 沂水县| 辰溪县| 土默特左旗| 宜良县| 沙洋县| 大竹县| 仲巴县| 西乌珠穆沁旗| 广德县| 新河县| 黄冈市| 新闻| 虞城县| 海宁市| 平邑县| 恩平市| 玛沁县| 左权县| 新巴尔虎左旗| 南阳市| 台南县| 五原县| 博兴县| 大港区| 枣阳市| 宜阳县| 青龙| 吉木萨尔县| 文昌市| 邵东县|