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

JAVA設(shè)計(jì)模式---單例模式你知道嗎

 更新時(shí)間:2021年09月03日 10:33:36   作者:大忽悠愛忽悠  
這篇文章主要給大家介紹了關(guān)于Java單例模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

單例模式的介紹

在這里插入圖片描述

單例模式實(shí)現(xiàn)的八種方式

在這里插入圖片描述

餓漢式

靜態(tài)常量

步驟:

1.構(gòu)造器私有化(防止new)

2.類的內(nèi)部創(chuàng)建對(duì)象

3.向外暴露一個(gè)靜態(tài)的公共方法—getInstance

//餓漢式靜態(tài)常量
class Singleton
{
  //構(gòu)造器私有化,外部不能new
    private Singleton(){}
    //靜態(tài)常量
    private final static  Singleton  instance=new Singleton();
    //提供一個(gè)公有的靜態(tài)方法,返回一個(gè)實(shí)例對(duì)象
    public static Singleton getInstance()
    {
     return instance;
    }
}
public class Main
{
    public static void main(String[] args)
    {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

在這里插入圖片描述

靜態(tài)代碼塊

//餓漢式靜態(tài)常量
class Singleton
{
  //構(gòu)造器私有化,外部不能new
    private Singleton(){}
    //靜態(tài)常量
    private static  Singleton  instance;
    //在靜態(tài)代碼塊中,創(chuàng)建單例對(duì)象
    static
    {
     instance=new Singleton();
    }
    //提供一個(gè)公有的靜態(tài)方法,返回一個(gè)實(shí)例對(duì)象
    public static Singleton getInstance()
    {
     return instance;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

靜態(tài)代碼塊的優(yōu)缺點(diǎn)

在這里插入圖片描述

懶漢式

線程不安全的寫法

class Singleton
{
  //構(gòu)造器私有化,外部不能new
    private Singleton(){}
    //靜態(tài)常量
    private static  Singleton  instance;
    //提供一個(gè)公有的靜態(tài)方法
    //當(dāng)使用該方法時(shí),才去創(chuàng)建實(shí)例對(duì)象
    //即懶漢式
    public static Singleton getInstance()
    {
        if(instance==null)
        {
            instance=new Singleton();
        }
     return instance;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

優(yōu)缺點(diǎn)

在這里插入圖片描述

線程安全,同步鎖—效率低,不推薦

class Singleton
{
  //構(gòu)造器私有化,外部不能new
    private Singleton(){}
    //靜態(tài)常量
    private static  Singleton  instance;
    //提供一個(gè)公有的靜態(tài)方法
    //當(dāng)使用該方法時(shí),才去創(chuàng)建實(shí)例對(duì)象
    //即懶漢式
    //給當(dāng)前靜態(tài)方法加上一個(gè)同步鎖,這樣所有的對(duì)象就是一把鎖
    //多個(gè)對(duì)象同時(shí)調(diào)用此方法,會(huì)按順序依次調(diào)用
    public static synchronized Singleton getInstance()
    {
        if(instance==null)
        {
            instance=new Singleton();
        }
     return instance;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

優(yōu)缺點(diǎn)

在這里插入圖片描述

線程安全,同步代碼塊—無(wú)法解決線程安全問(wèn)題,不推薦

class Singleton
{
  //構(gòu)造器私有化,外部不能new
    private Singleton(){}
    //靜態(tài)常量
    private static  Singleton  instance;
    //提供一個(gè)公有的靜態(tài)方法
    //當(dāng)使用該方法時(shí),才去創(chuàng)建實(shí)例對(duì)象
    //即懶漢式
    public static  Singleton getInstance()
    {
        if(instance==null)
        {
            //鎖的是代碼塊
            //鎖的對(duì)象是當(dāng)前類的字節(jié)碼文件對(duì)象,即當(dāng)前類的所有勢(shì)力對(duì)象擁有一把鎖
            synchronized(Singleton.class)
            {
                instance=new Singleton();
            }
        }
     return instance;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

優(yōu)缺點(diǎn)

在這里插入圖片描述

雙重檢查—解決線程安全和懶加載問(wèn)題–推薦使用

class Singleton
{
  //構(gòu)造器私有化,外部不能new
    private Singleton(){}
    //靜態(tài)常量
    //volatile 保證變量在多線程下的可見性,即每個(gè)線程獲取到當(dāng)前變量的值是最新的值
    private static  volatile Singleton  instance;
    //提供一個(gè)公有的靜態(tài)方法
    //當(dāng)使用該方法時(shí),才去創(chuàng)建實(shí)例對(duì)象
    public static  Singleton getInstance()
    {
        //加入雙重檢查問(wèn)題,解決線程安全,同時(shí)解決懶加載問(wèn)題
        if(instance==null)
        {
            //鎖的是代碼塊
            //鎖的對(duì)象是當(dāng)前類的字節(jié)碼文件對(duì)象,即當(dāng)前類的所有勢(shì)力對(duì)象擁有一把鎖
            synchronized(Singleton.class)
            {
                if(instance==null)
                {
                    instance=new Singleton();
                }
            }
        }
     return instance;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

優(yōu)缺點(diǎn)

在這里插入圖片描述

靜態(tài)內(nèi)部類—可以實(shí)現(xiàn)懶加載,線程安全,推薦使用

靜態(tài)內(nèi)部類在調(diào)用時(shí),才會(huì)加載

當(dāng)一個(gè)Java類第一次被真正使用到的時(shí)候靜態(tài)資源被初始化、Java類的加載和初始化過(guò)程都是線程安全的

class Singleton
{
  //構(gòu)造器私有化,外部不能new
    private Singleton(){}
//靜態(tài)內(nèi)部類
    private static class SingletonInstance{
        //靜態(tài)屬性
        private static final Singleton INSTANCE=new Singleton();
}
    public static  Singleton getInstance()
    {
        //該方法調(diào)用時(shí),靜態(tài)內(nèi)部類加載,里面的靜態(tài)屬性才會(huì)賦值
        return SingletonInstance.INSTANCE;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

優(yōu)缺點(diǎn)

在這里插入圖片描述

枚舉

enum Singleton
{
    //枚舉常量
    INSTANCE;
    //底層: public static final Singleton INSTANCE= new Singleton ();
    //方法
    public void getInstance()
    {
        System.out.println("得到實(shí)例");
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.INSTANCE;
        Singleton s2=Singleton.INSTANCE;
        s1.getInstance();
        s2.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

優(yōu)缺點(diǎn)

在這里插入圖片描述

單例模式注意事項(xiàng)

在這里插入圖片描述

總結(jié)

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

相關(guān)文章

  • 優(yōu)化MyBatis配置文件中的配置詳解

    優(yōu)化MyBatis配置文件中的配置詳解

    這篇文章主要介紹了優(yōu)化MyBatis配置文件中的配置詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java實(shí)現(xiàn)直接插入排序和折半插入排序算法示例

    Java實(shí)現(xiàn)直接插入排序和折半插入排序算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)直接插入排序和折半插入排序算法示例,文中對(duì)算法的思想和時(shí)間復(fù)雜度都有簡(jiǎn)單的講解,需要的朋友可以參考下
    2016-04-04
  • 解決SpringBoot運(yùn)行Test時(shí)報(bào)錯(cuò):SpringBoot Unable to find

    解決SpringBoot運(yùn)行Test時(shí)報(bào)錯(cuò):SpringBoot Unable to find

    這篇文章主要介紹了SpringBoot運(yùn)行Test時(shí)報(bào)錯(cuò):SpringBoot Unable to find a @SpringBootConfiguration,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java的JSON處理器fastjson使用方法詳解

    Java的JSON處理器fastjson使用方法詳解

    下面小編就為大家?guī)?lái)一篇Java的JSON處理器fastjson使用方法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • 使用 Java8 實(shí)現(xiàn)觀察者模式的方法(下)

    使用 Java8 實(shí)現(xiàn)觀察者模式的方法(下)

    這篇文章主要介紹了使用 Java8 實(shí)現(xiàn)觀察者模式的方法(下)的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • java中使用dom4j解析XML文件的方法教程

    java中使用dom4j解析XML文件的方法教程

    在最近的開發(fā)中用到了dom4j來(lái)解析xml文件,所以便有了這篇文章,本文主要給大家介紹了關(guān)于java中使用dom4j解析XML文件的方法教程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • Spring?Security中自定義cors配置及原理解析

    Spring?Security中自定義cors配置及原理解析

    在Spring框架中,通過(guò)自定義CORS配置可根據(jù)實(shí)際情況調(diào)整URL的協(xié)議、主機(jī)、端口等,以適應(yīng)"同源安全策略",配置原理涉及CorsConfigurer和CorsFilter,自定義配置需要注意@Configuration注解、方法名以及可能的@Autowired注解
    2024-10-10
  • LeetCode?動(dòng)態(tài)規(guī)劃之矩陣區(qū)域和詳情

    LeetCode?動(dòng)態(tài)規(guī)劃之矩陣區(qū)域和詳情

    這篇文章主要介紹了LeetCode?動(dòng)態(tài)規(guī)劃之矩陣區(qū)域和詳情,文章基于Java的相關(guān)資料展開對(duì)LeetCode?動(dòng)態(tài)規(guī)劃的詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-04-04
  • java實(shí)現(xiàn)簡(jiǎn)單的學(xué)生管理系統(tǒng)

    java實(shí)現(xiàn)簡(jiǎn)單的學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Redis?Java客戶端建立的兩種方式小結(jié)

    Redis?Java客戶端建立的兩種方式小結(jié)

    Redis具有快速讀取數(shù)據(jù)的能力,將經(jīng)常訪問(wèn)的數(shù)據(jù)緩存到Redis中,可以減輕數(shù)據(jù)庫(kù)的壓力,本文主要介紹了Redis?Java客戶端建立的兩種方式小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04

最新評(píng)論

静宁县| 玉门市| 郧西县| 蕲春县| 南岸区| 台安县| 台中县| 阿荣旗| 韶山市| 乳山市| 绥阳县| 苗栗市| 望都县| 建昌县| 崇义县| 铅山县| 淅川县| 晋中市| 喀喇沁旗| 旬阳县| 河间市| 达拉特旗| 高尔夫| 江门市| 普宁市| 云和县| 青海省| 高密市| 利津县| 德钦县| 蚌埠市| 金寨县| 呼伦贝尔市| 钟祥市| 武乡县| 台山市| 鄂尔多斯市| 比如县| 比如县| 新巴尔虎右旗| 内乡县|