成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們一起聊聊Java極簡設計模式:單例模式(Singleton)

開發 前端
單例設計模式(Singleton),多一句沒有,少一句不行,用最簡短的篇幅講述設計模式最核心的知識,好了,開始今天的內容??磶讉€單例對象的示例代碼,其中有些代碼是線程安全的,有些則不是線程安全的,需要大家細細品味,這些代碼也是冰河本人在高并發環境下測試驗證過的。
  • 本章難度:★★☆☆☆
  • 本章重點:介紹創建Java單例對象的七種方式,重點掌握哪些創建方式是線程安全的,哪些方式是線程不安全的,并能夠在實際項目中靈活運用設計模式,編寫可維護的代碼。

大家好,我是冰河~~

今天給大家介紹《Java極簡設計模式》的第01章,單例設計模式(Singleton),多一句沒有,少一句不行,用最簡短的篇幅講述設計模式最核心的知識,好了,開始今天的內容。

單例設計模式

看幾個單例對象的示例代碼,其中有些代碼是線程安全的,有些則不是線程安全的,需要大家細細品味,這些代碼也是冰河本人在高并發環境下測試驗證過的。

  • 代碼一:SingletonExample1

這個類是懶漢模式,并且是線程不安全的

package io.binghe.concurrency.example.singleton;
/**
 * @author binghe
 * @version 1.0.0
 * @description 懶漢模式,單例實例在第一次使用的時候進行創建,這個類是線程不安全的
 */
public class SingletonExample1 {

    private SingletonExample1(){}

    private static SingletonExample1 instance = null;

    public static SingletonExample1 getInstance(){
        //多個線程同時調用,可能會創建多個對象
        if (instance == null){
            instance = new SingletonExample1();
        }
        return instance;
    }
}
  • 代碼二:SingletonExample2

餓漢模式,單例實例在類裝載的時候進行創建,是線程安全的

package io.binghe.concurrency.example.singleton;
/**
 * @author binghe
 * @version 1.0.0
 * @description 餓漢模式,單例實例在類裝載的時候進行創建,是線程安全的
 */
public class SingletonExample2 {

    private SingletonExample2(){}

    private static SingletonExample2 instance = new SingletonExample2();

    public static SingletonExample2 getInstance(){
        return instance;
    }
}
  • 代碼三:SingletonExample3

懶漢模式,單例實例在第一次使用的時候進行創建,這個類是線程安全的,但是這個寫法不推薦

package io.binghe.concurrency.example.singleton;
/**
 * @author binghe
 * @version 1.0.0
 * @description 懶漢模式,單例實例在第一次使用的時候進行創建,這個類是線程安全的,但是這個寫法不推薦
 */
public class SingletonExample3 {

    private SingletonExample3(){}

    private static SingletonExample3 instance = null;

    public static synchronized SingletonExample3 getInstance(){
        if (instance == null){
            instance = new SingletonExample3();
        }
        return instance;
    }
}
  • 代碼四:SingletonExample4

懶漢模式(雙重鎖同步鎖單例模式),單例實例在第一次使用的時候進行創建,但是,這個類不是線程安全的?。。。。?/p>

package io.binghe.concurrency.example.singleton;
/**
 * @author binghe
 * @version 1.0.0
 * @description 懶漢模式(雙重鎖同步鎖單例模式)
 *              單例實例在第一次使用的時候進行創建,這個類不是線程安全的
 */
public class SingletonExample4 {

    private SingletonExample4(){}

    private static SingletonExample4 instance = null;

    //線程不安全
    //當執行instance = new SingletonExample4();這行代碼時,CPU會執行如下指令:
    //1.memory = allocate() 分配對象的內存空間
    //2.ctorInstance() 初始化對象
    //3.instance = memory 設置instance指向剛分配的內存
    //單純執行以上三步沒啥問題,但是在多線程情況下,可能會發生指令重排序。
    // 指令重排序對單線程沒有影響,單線程下CPU可以按照順序執行以上三個步驟,但是在多線程下,如果發生了指令重排序,則會打亂上面的三個步驟。

    //如果發生了JVM和CPU優化,發生重排序時,可能會按照下面的順序執行:
    //1.memory = allocate() 分配對象的內存空間
    //3.instance = memory 設置instance指向剛分配的內存
    //2.ctorInstance() 初始化對象


    //假設目前有兩個線程A和B同時執行getInstance()方法,A線程執行到instance = new SingletonExample4(); B線程剛執行到第一個 if (instance == null){處,
    //如果按照1.3.2的順序,假設線程A執行到3.instance = memory 設置instance指向剛分配的內存,此時,線程B判斷instance已經有值,就會直接return instance;
    //而實際上,線程A還未執行2.ctorInstance() 初始化對象,也就是說線程B拿到的instance對象還未進行初始化,這個未初始化的instance對象一旦被線程B使用,就會出現問題。


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

線程不安全分析如下:

當執行instance = new SingletonExample4();這行代碼時,CPU會執行如下指令:

1.memory = allocate() 分配對象的內存空間 2.ctorInstance() 初始化對象 3.instance = memory 設置instance指向剛分配的內存

單純執行以上三步沒啥問題,但是在多線程情況下,可能會發生指令重排序。

指令重排序對單線程沒有影響,單線程下CPU可以按照順序執行以上三個步驟,但是在多線程下,如果發生了指令重排序,則會打亂上面的三個步驟。

如果發生了JVM和CPU優化,發生重排序時,可能會按照下面的順序執行:

1.memory = allocate() 分配對象的內存空間 3.instance = memory 設置instance指向剛分配的內存 2.ctorInstance() 初始化對象

假設目前有兩個線程A和B同時執行getInstance()方法,A線程執行到instance = new SingletonExample4(); B線程剛執行到第一個 if (instance == null){處,如果按照1.3.2的順序,假設線程A執行到3.instance = memory 設置instance指向剛分配的內存,此時,線程B判斷instance已經有值,就會直接return instance;而實際上,線程A還未執行2.ctorInstance() 初始化對象,也就是說線程B拿到的instance對象還未進行初始化,這個未初始化的instance對象一旦被線程B使用,就會出現問題。

  • 代碼五:SingletonExample5

懶漢模式(雙重鎖同步鎖單例模式)單例實例在第一次使用的時候進行創建,這個類是線程安全的,使用的是 volatile + 雙重檢測機制來禁止指令重排達到線程安全

package io.binghe.concurrency.example.singleton;
/**
 * @author binghe
 * @version 1.0.0
 * @description 懶漢模式(雙重鎖同步鎖單例模式)
 *              單例實例在第一次使用的時候進行創建,這個類是線程安全的
 */
public class SingletonExample5 {

    private SingletonExample5(){}

    //單例對象  volatile + 雙重檢測機制來禁止指令重排
    private volatile static SingletonExample5 instance = null;

    public static SingletonExample5 getInstance(){
        if (instance == null){
            synchronized (SingletonExample5.class){
                if(instance == null){
                    instance = new SingletonExample5();
                }
            }
        }
        return instance;
    }
}
  • 代碼六:SingletonExample6

餓漢模式,單例實例在類裝載的時候(使用靜態代碼塊)進行創建,是線程安全的

package io.binghe.concurrency.example.singleton;
/**
 * @author binghe
 * @version 1.0.0
 * @description 餓漢模式,單例實例在類裝載的時候進行創建,是線程安全的
 */
public class SingletonExample6 {

    private SingletonExample6(){}

    private static SingletonExample6 instance = null;

    static {
        instance = new SingletonExample6();
    }

    public static SingletonExample6 getInstance(){
        return instance;
    }
}
  • 代碼七:SingletonExample7

枚舉方式進行實例化,是線程安全的,此種方式也是線程最安全的

package io.binghe.concurrency.example.singleton;
/**
 * @author binghe
 * @version 1.0.0
 * @description 枚舉方式進行實例化,是線程安全的,此種方式也是線程最安全的
 */
public class SingletonExample7 {

    private SingletonExample7(){}

    public static SingletonExample7 getInstance(){
        return Singleton.INSTANCE.getInstance();
    }

    private enum Singleton{
        INSTANCE;
        private SingletonExample7 singleton;

        //JVM保證這個方法絕對只調用一次
        Singleton(){
            singleton = new SingletonExample7();
        }
        public SingletonExample7 getInstance(){
            return singleton;
        }
    }
}


責任編輯:武曉燕 來源: 冰河技術
相關推薦

2023-08-07 08:04:05

動態抽象工廠模式

2024-01-01 08:19:32

模式History前端

2022-01-04 12:08:46

設計接口

2023-06-20 07:27:07

架構組件插件

2021-02-01 10:01:58

設計模式 Java單例模式

2025-03-27 02:00:00

SPIJava接口

2022-07-29 08:17:46

Java對象內存

2023-08-10 08:28:46

網絡編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-06-30 08:18:51

敏捷開發模式

2022-05-24 08:21:16

數據安全API

2023-09-10 21:42:31

2022-08-26 00:35:31

Java工作流系統

2021-02-07 23:58:10

單例模式對象

2022-07-28 09:44:04

內存實模式保護模式

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2023-11-30 07:40:05

URLCMS

2024-10-29 11:19:23

點贊系統同步

2021-03-02 08:50:31

設計單例模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区精品视频 | www.99热.com| 综合精品久久久 | 综合一区二区三区 | www.4hu影院 | 欧美一区二区三区在线观看 | 99久久国产免费 | 国产永久免费 | 中文字幕一区二区在线观看 | 欧美国产日韩一区二区三区 | 午夜成人在线视频 | 亚洲精品电影在线观看 | 国产欧美日韩一区二区三区在线 | 欧美日韩精品在线一区 | 国产黄色免费网站 | 伊人网伊人| 日本视频免费 | 国产一区二区日韩 | 日本一本在线 | 久久久久国产一区二区三区四区 | 亚洲精品第一国产综合野 | 国产成人精品一区二区三区在线 | 刘亦菲国产毛片bd | 亚洲欧美视频 | 青青草一区二区 | 一区二区三区四区电影视频在线观看 | 久久久久久久国产 | 亚洲精品乱码久久久久久久久 | 欧美午夜精品理论片a级按摩 | 中国大陆高清aⅴ毛片 | 亚洲视频一区二区三区四区 | 毛片a区| 国产不卡视频 | 色综合久 | 欧美在线观看黄色 | www.天天干.com | 国产一区免费视频 | 求个av网址 | 日本免费网 | 中日av | 欧美色综合一区二区三区 |