亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Java利用static實(shí)現(xiàn)單例模式

 更新時(shí)間:2022年01月09日 10:11:23   作者:靈劍山真人  
這篇文章主要介紹了基于Java利用static實(shí)現(xiàn)單例模式,當(dāng)在多個(gè)線程同時(shí)觸發(fā)類的初始化過(guò)程的時(shí)候static不會(huì)被多次執(zhí)行,下面我們一起進(jìn)入文章看看具體要的原因

一、之前舊的寫(xiě)法

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

就利用Sington.getInstace就可以了,獲得的是同一個(gè)實(shí)例。

上面那個(gè)代碼有兩個(gè)優(yōu)點(diǎn):

  • 懶加載,把在堆創(chuàng)建實(shí)例這個(gè)行為延遲到類的使用時(shí)。
  • 鎖效果,防止生成多個(gè)實(shí)例,因?yàn)?code>synchronized修飾這個(gè)static方法,所以相當(dāng)于給這個(gè)方法加上了一個(gè)類鎖??。

二、static代碼塊的效果

先來(lái)看一段代碼:

 

class StaticClass{
? ? private static int a = 1;
? ? static{
? ? ? ? System.out.println("語(yǔ)句1");
? ? ? ? System.out.println("語(yǔ)句2");
? ? }
? ? static{
? ? ? ? System.out.println("語(yǔ)句3");
? ? ? ? System.out.println("語(yǔ)句4");
? ? }
}

當(dāng)在多個(gè)線程同時(shí)觸發(fā)類的初始化過(guò)程的時(shí)候(在初始化過(guò)程,類的static變量會(huì)被賦值為JVM默認(rèn)值并且static代碼塊會(huì)被執(zhí)行),為什么static不會(huì)被多次執(zhí)行?因?yàn)橛锌赡軆蓚€(gè)線程同時(shí)檢測(cè)到類還沒(méi)被初始化,然后都執(zhí)行static代碼塊,結(jié)果就把語(yǔ)句1234多打印了,為什么上述情況不會(huì)發(fā)生。

Thread thread1 = new Thread(new Runnable() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void run() {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? Class.forName("StaticClass");//這一行觸發(fā)類的初始化導(dǎo)致靜態(tài)代碼塊執(zhí)行
? ? ? ? ? ? ? ? } catch (ClassNotFoundException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? thread1.start();
? ? ? ? Thread thread2 = new Thread(new Runnable() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void run() {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? Class.forName("StaticClass");//同樣
? ? ? ? ? ? ? ? } catch (ClassNotFoundException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? thread2.start();

結(jié)果如下:

語(yǔ)句1
語(yǔ)句2
語(yǔ)句3
語(yǔ)句4

有一段英文對(duì)其進(jìn)行了解釋:

static initialization block can be triggered from multiple parallel threads (when the loading of the class happens in the first time), Java runtime guarantees that it will be executed only once and in thread-safe manner + when we have more than 1 static block - it guarantees the sequential execution of the blocks, 也就是說(shuō),java runtime幫我們做了兩件事:

  • 在并行線程中,都出現(xiàn)了第一次初始化類的情況,保證類的初始化只執(zhí)行一次。
  • 保證static代碼塊的順序執(zhí)行

三、單例的另一種寫(xiě)法

有了對(duì)static的知識(shí)的了解之后,我們可以寫(xiě)出這樣的單例模式:

class Singleton{
? ? private Singleton() {}
? ? private static class NestedClass{
? ? ? ?static Singleton instance = new Singleton();//這條賦值語(yǔ)句會(huì)在初始化時(shí)才運(yùn)行
? ? }
? ? public static Singleton getInstance() {
? ? ? ? return NestedClass.instance;
? ? }
}
  • 懶加載,因?yàn)?code>static語(yǔ)句會(huì)在初始化時(shí)才賦值運(yùn)行,達(dá)到了懶加載的效果。
  • 鎖??的效果由Java runtime保證,虛擬機(jī)幫我們保證static語(yǔ)句在初始化時(shí)只會(huì)執(zhí)行一次。

四、總結(jié)

如果不知道static的基礎(chǔ)知識(shí)和虛擬機(jī)類加載的知識(shí),我可能并不會(huì)知道這一種方法。理論永遠(yuǎn)先行于技術(shù),要學(xué)好理論才能從根本上提升自己。

到此這篇關(guān)于基于Java利用static實(shí)現(xiàn)單例模式的文章就介紹到這了,更多相關(guān)static實(shí)現(xiàn)單例模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis之typeAlias配置的3種方式小結(jié)

    Mybatis之typeAlias配置的3種方式小結(jié)

    這篇文章主要介紹了Mybatis之typeAlias配置的3種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Springboot項(xiàng)目出現(xiàn)java.lang.ArrayStoreException的異常分析

    Springboot項(xiàng)目出現(xiàn)java.lang.ArrayStoreException的異常分析

    這篇文章介紹了Springboot項(xiàng)目出現(xiàn)java.lang.ArrayStoreException的異常分析,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • SpringBoot多環(huán)境配置及日志記錄器詳解

    SpringBoot多環(huán)境配置及日志記錄器詳解

    這篇文章主要介紹了SpringBoot多環(huán)境配置及日志記錄器詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • java中的transient關(guān)鍵字解讀

    java中的transient關(guān)鍵字解讀

    這篇文章主要介紹了java中的transient關(guān)鍵字解讀,transient關(guān)鍵字的主要作用就是讓某些被transient關(guān)鍵字修飾的成員屬性變量不被序列化,實(shí)際上也正是因此,在學(xué)習(xí)過(guò)程中很少用得上序列化操作,一般都是在實(shí)際開(kāi)發(fā)中,需要的朋友可以參考下
    2023-09-09
  • Android中幾種圖片特效的處理的實(shí)現(xiàn)方法

    Android中幾種圖片特效的處理的實(shí)現(xiàn)方法

    這篇文章主要介紹了 Android中幾種圖片特效的處理的實(shí)現(xiàn)方法的相關(guān)資料,這里有放大縮小圖片,獲得圓角圖片,獲得帶倒影圖片的幾種方法,需要的朋友可以參考下
    2017-08-08
  • java 中動(dòng)態(tài)代理詳解及實(shí)例

    java 中動(dòng)態(tài)代理詳解及實(shí)例

    這篇文章主要介紹了java 中動(dòng)態(tài)代理詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 實(shí)例講解Java設(shè)計(jì)模式編程中如何運(yùn)用代理模式

    實(shí)例講解Java設(shè)計(jì)模式編程中如何運(yùn)用代理模式

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中如何運(yùn)用代理模式,文中舉了普通代理和強(qiáng)制代理的例子作為代理模式的擴(kuò)展內(nèi)容,需要的朋友可以參考下
    2016-02-02
  • Java設(shè)計(jì)模式之接口隔離原則精解

    Java設(shè)計(jì)模式之接口隔離原則精解

    設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)的面向?qū)ο蟮能浖_(kāi)發(fā)人員所采用。設(shè)計(jì)模式是軟件開(kāi)發(fā)人員在軟件開(kāi)發(fā)過(guò)程中面臨的一般問(wèn)題的解決方案。本篇介紹設(shè)計(jì)模式七大原則之一的接口隔離原則
    2022-02-02
  • Springboot創(chuàng)建項(xiàng)目的圖文教程(idea版本)

    Springboot創(chuàng)建項(xiàng)目的圖文教程(idea版本)

    這篇文章主要介紹了Springboot創(chuàng)建項(xiàng)目的圖文教程(idea版本),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • MyBatisPlus?TypeHandler自定義字段類型轉(zhuǎn)換Handler

    MyBatisPlus?TypeHandler自定義字段類型轉(zhuǎn)換Handler

    這篇文章主要為大家介紹了MyBatisPlus?TypeHandler自定義字段類型轉(zhuǎn)換Handler示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論