欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 如何安全的發(fā)布對(duì)象

 更新時(shí)間:2021年01月04日 10:18:55   作者:入門(mén)小站  
這篇文章主要介紹了Java 如何安全的發(fā)布對(duì)象,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

安全發(fā)布對(duì)象

  • 在靜態(tài)初始化函數(shù)中初始化一個(gè)對(duì)象引用
  • 將對(duì)象的引用保存到volatile類(lèi)型域或者AtomicReference對(duì)象中
  • 將對(duì)象的引用保存到某個(gè)正確構(gòu)造對(duì)象的final類(lèi)型域中
  • 將對(duì)象的引用保存到一個(gè)由鎖保護(hù)的域中

Spring 框架中,Spring管理的類(lèi)都是單例模式。如何保證一個(gè)實(shí)例只被初始化一次,且線程安全?通過(guò)不同單例的寫(xiě)法,具體描述安全發(fā)布對(duì)象的四種方法:

在靜態(tài)初始化函數(shù)中初始化一個(gè)對(duì)象的引用(不推薦)

package com.rumenz.task.single;


//線程安全
//餓漢模式
//靜態(tài)代碼塊初始化
public class SingletonExample {
  private SingletonExample(){
    //初始化操作
  }
  private static SingletonExample singletonExample=null;

  static {
    singletonExample=new SingletonExample();
  }

  public static SingletonExample getInstance(){
    return singletonExample;
  }
}

//或者
package com.rumenz.task.single;
//線程安全
//餓漢模式
//靜態(tài)代碼塊初始化
public class SingletonExample {
  private SingletonExample(){

    //初始化操作

  }
  private static SingletonExample singletonExample=new SingletonExample();



  public static SingletonExample getInstance(){
    return singletonExample;
  }
}

缺點(diǎn):用不用都會(huì)初始化對(duì)象,如果初始化工作較多,加載速度會(huì)變慢,影響系統(tǒng)性能。

將對(duì)象的引用保存到volatile類(lèi)型或AtomicReference對(duì)象中(推薦)

package com.rumenz.task.single;

//線程安全
//懶漢模式
public class SingletonExample1 {

  private SingletonExample1() {
    //初始化操作
  }
  // 1、memory = allocate() 分配對(duì)象的內(nèi)存空間
  // 2、ctorInstance() 初始化對(duì)象
  // 3、instance = memory 設(shè)置instance指向剛分配的內(nèi)存
  // 單例對(duì)象 volatile + 雙重檢測(cè)機(jī)制 -> 禁止指令重排
  private volatile static SingletonExample1 singletonExample1=null;
  //靜態(tài)工廠方法
  public static SingletonExample1 getInstance(){
    if(singletonExample1==null){ //雙重檢測(cè)
      synchronized(SingletonExample1.class){ //同步鎖
        if(singletonExample1==null){
          singletonExample1=new SingletonExample1();
        }
      }
    }
    return singletonExample1;
  }
}

優(yōu)點(diǎn):按需加載
缺點(diǎn):第一次初始化的時(shí)候可能會(huì)比較慢

通過(guò)synchronized(不推薦)

package com.rumenz.task.single;

public class SingletonExample3 {
  //私有構(gòu)造函數(shù)
  private SingletonExample3(){
    //初始化操作
  }

  private static SingletonExample3 singletonExample3=null;
  //靜態(tài)的工廠方法
  public static synchronized SingletonExample3 getSingletonExample3(){
     if(singletonExample3==null){
       singletonExample3=new SingletonExample3();
     }
     return singletonExample3;
  }
}

缺點(diǎn):每次進(jìn)入getSingletonExample3都會(huì)加鎖,耗費(fèi)資源,故不推薦使用。

枚舉(推薦)

package com.rumenz.task.single;

public class SingletonExample4 {

  //私有構(gòu)造函數(shù)
  private SingletonExample4(){
    //初始化
  }
  public static SingletonExample4 getSingletonExample4(){
    return Singleton.INSTANCE.getSingleton();
  }
  private enum Singleton{
    INSTANCE;
    private SingletonExample4 singleton;
    Singleton(){
      singleton=new SingletonExample4();
    }
    public SingletonExample4 getSingleton(){
      return singleton;
    }

  }
}

優(yōu)點(diǎn):天然線程安全,可防止反射生成實(shí)例,推薦使用

以上就是Java 如何安全的發(fā)布對(duì)象的詳細(xì)內(nèi)容,更多關(guān)于Java 安全的發(fā)布對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot+layuimini實(shí)現(xiàn)左側(cè)菜單動(dòng)態(tài)展示的示例代碼

    SpringBoot+layuimini實(shí)現(xiàn)左側(cè)菜單動(dòng)態(tài)展示的示例代碼

    Layuimini是Layui的升級(jí)版,它是專(zhuān)業(yè)做后臺(tái)頁(yè)面的框架,而且是適合PC端和移動(dòng)端,以下地址可以在PC端顯示,也可以在手機(jī)上顯示,只不過(guò)會(huì)做自適應(yīng),本文將給大家介紹了SpringBoot+layuimini實(shí)現(xiàn)左側(cè)菜單動(dòng)態(tài)展示的方法,需要的朋友可以參考下
    2024-04-04
  • Java一些常見(jiàn)的出錯(cuò)異常處理方法總結(jié)

    Java一些常見(jiàn)的出錯(cuò)異常處理方法總結(jié)

    下面小編就為大家?guī)?lái)一篇Java一些常見(jiàn)的出錯(cuò)異常處理方法總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • Spring中容器的創(chuàng)建流程詳細(xì)解讀

    Spring中容器的創(chuàng)建流程詳細(xì)解讀

    這篇文章主要介紹了Spring中容器的創(chuàng)建流程詳細(xì)解讀,Spring?框架其本質(zhì)是作為一個(gè)容器,提供給應(yīng)用程序需要的對(duì)象,了解容器的誕生過(guò)程,有助于我們理解?Spring?框架,也便于我們“插手”這個(gè)過(guò)程,需要的朋友可以參考下
    2023-10-10
  • JDBC實(shí)現(xiàn)Mysql自動(dòng)重連機(jī)制的方法詳解

    JDBC實(shí)現(xiàn)Mysql自動(dòng)重連機(jī)制的方法詳解

    最近在工作中發(fā)現(xiàn)了一個(gè)問(wèn)題,通過(guò)查找相關(guān)的資料終于解決了,下面這篇文章主要給大家介紹了關(guān)于JDBC實(shí)現(xiàn)Mysql自動(dòng)重連機(jī)制的相關(guān)資料,文中給出多種解決的方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07
  • springboot如何解決跨域后session獲取不到sessionId不一致

    springboot如何解決跨域后session獲取不到sessionId不一致

    這篇文章主要介紹了springboot如何解決跨域后session獲取不到sessionId不一致問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 深入理解Java中的EnumMap和EnumSet

    深入理解Java中的EnumMap和EnumSet

    這篇文章主要介紹了深入理解Java中的EnumMap和EnumSet,一般來(lái)說(shuō)我們會(huì)選擇使用HashMap來(lái)存儲(chǔ)key-value格式的數(shù)據(jù),考慮這樣的特殊情況,一個(gè)HashMap的key都來(lái)自于一個(gè)Enum類(lèi),這樣的情況則可以考慮使用本文要講的EnumMap,需要的朋友可以參考下
    2023-11-11
  • 分析Springboot中嵌套事務(wù)失效原因詳解

    分析Springboot中嵌套事務(wù)失效原因詳解

    這篇文章主要為大家介紹了分析Springboot中嵌套事務(wù)失效原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • SpringBoot+OCR?實(shí)現(xiàn)圖片文字識(shí)別

    SpringBoot+OCR?實(shí)現(xiàn)圖片文字識(shí)別

    本文主要介紹了SpringBoot+OCR 實(shí)現(xiàn)圖片文字識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java中日期格式化YYYY-DD的操作bug

    Java中日期格式化YYYY-DD的操作bug

    這篇文章主要介紹了Java中日期格式化YYYY-DD中遇到的坑,本文給大家分享到腳本之家平臺(tái),需要的朋友可以參考下
    2020-01-01
  • Java集合中的fail-fast(快速失敗)機(jī)制詳解

    Java集合中的fail-fast(快速失敗)機(jī)制詳解

    這篇文章主要給大家介紹了關(guān)于Java集合中fail-fast(快速失敗)機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評(píng)論