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

java 設(shè)計模型之單例模式詳解

 更新時間:2016年07月07日 09:14:39   投稿:lqh  
本文主要介紹了java 單例模式,單例對象(Singleton)是一種常用的設(shè)計模式。在Java應(yīng)用中,單例對象能保證在一個JVM中,該對象只有一個實例存在,希望能幫助有需要的同學(xué)

Singleton 模式的宗旨在于確保某個類只有一個實例,別且為之提供一個全局訪問點。為了防止其他工作人員實例化我們的類,

可以為該類創(chuàng)建唯一一個構(gòu)造器,并將構(gòu)造器的可見設(shè)置為私有。值得注意的是,如果我們創(chuàng)建了其他的非私有的構(gòu)造器,或者根本沒有為該類提

供構(gòu)造器,那么其他人員還是能實例化我們的類。 如果不希望提前創(chuàng)建單例對象,我們可以等到第一次使用該單例對象的時候在創(chuàng)建它,即

滯后初始化。滯后初始化單例對象有兩個理由:

1.也許在靜態(tài)初始化時間,你沒有關(guān)于如何初始化單例對象的足夠信息。

2.選擇滯后初始化單例的目的也許為了等待資源,諸如數(shù)據(jù)庫連接,尤其是在某些特定會話中不需要這個單例的應(yīng)用程序中。
  如果在多線程環(huán)境中對單例采用滯后初始化,那么我們必須小心防止多個線程同時初始化該

通常單例模式在Java語言中,有兩種構(gòu)建方式:

懶漢方式:指全局的單例實例在第一次被使用時構(gòu)建。延遲初始化。

餓漢方式:指全局的單例實例在類裝載時構(gòu)建。 急切初始化。

1,餓漢式單例類

public class Singleton1 {
 
 private Singleton1() {
 }
 // 在自己內(nèi)部定義自己一個實例.
 // 注意這是private 只供內(nèi)部調(diào)用

 private static Singleton1 instance = new Singleton1();

 /** *//**
 * 這里提供了一個供外部訪問本class的靜態(tài)方法,可以直接訪問  
 * @return
 */
 public static Singleton1 getInstance() {
 return instance;
 }
}

2,懶漢式單例類

public class Singleton2 {

 private static Singleton2 instance = null;
 /** *//**
 * 這個方法比上面有所改進(jìn),不用每次都進(jìn)行生成對象,只是第一次   
 * 使用時生成實例,提高了效率!
 * @return
 */
 public static Singleton2 getInstance() { 
 if (instance == null)
 instance = new Singleton2();
 return instance;
 }
}

下面主要多線程問題,在懶漢單例中,單線程是沒有問題的,但多線程時就會有可能出現(xiàn)兩個或者以上的Singletion2實例的情況。

例如:線程1在判斷instance==null為真,掃行new操作時,在執(zhí)行new操作之前,判斷為真之后,線程2正好執(zhí)行判斷操作,這時instance還為null.因此,線程2也會執(zhí)行new操作。以此類推,在高并發(fā)下面,就可能存在兩個或者以上的Singletion2的實例。顯然,這是不正確的。

因此改變代碼如下:

public class Singleton3 {

 private static Singleton3 instance = null;
 /** *//**
 * 這個方法比上面有所改進(jìn),不用每次都進(jìn)行生成對象,只是第一次   
 * 使用時生成實例,提高了效率!
 * 為了多線程不出錯,加入了同步標(biāo)志
 * @return
 */
 public static synchronized Singleton3 getInstance() { 
 if (instance == null)
 instance = new Singleton3();
 return instance;
 }

}

但這樣又產(chǎn)生了一個問題,每次獲取實例時方法都是同步的,顯然性能很受影響的,所以繼續(xù)更改代碼如下:

 volatile, 用更低的代價替代同步

 為什么使用volatile比同步代價更低?
同步的代價, 主要由其覆蓋范圍決定, 如果可以降低同步的覆蓋范圍, 則可以大幅提升程序性能.

而volatile的覆蓋范圍僅僅變量級別的. 因此它的同步代價很低.

volatile原理是什么?

volatile的語義, 其實是告訴處理器, 不要將我放入工作內(nèi)存, 請直接在主存操作我.(工作內(nèi)存詳見java內(nèi)存模型)

因此, 當(dāng)多核或多線程在訪問該變量時, 都將直接操作主存, 這從本質(zhì)上, 做到了變量共享.

volatile的有什么優(yōu)勢?
1, 更大的程序吞吐量
2, 更少的代碼實現(xiàn)多線程
3, 程序的伸縮性較好
4, 比較好理解, 無需太高的學(xué)習(xí)成本

volatile有什么劣勢?
1, 容易出問題
2, 比較難設(shè)計

volatile使用jdk要求1.5版本及1.5以上。

改進(jìn)后的代碼如下(又叫雙重加鎖):

public class Singleton4 {
 private static volatile Singleton4 instance;
 /** *//**
 * 雙重加鎖實現(xiàn)多線程運用和性能優(yōu)化
 * @return
 */
 public static Singleton4 getInstance()
 {
 if (instance == null)
 {
 synchronized(Singleton4.class) { //1
 if (instance == null) //2
 instance = new Singleton4(); //3
 }
 }
 return instance;
 }
}

相關(guān)文章

  • 詳解SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo)

    詳解SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo)

    這篇文章主要介紹了SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • java基于NIO實現(xiàn)群聊模式

    java基于NIO實現(xiàn)群聊模式

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)NIO實現(xiàn)群聊模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Tomcat ClassLoader打破雙親委派源碼解析

    Tomcat ClassLoader打破雙親委派源碼解析

    這篇文章主要為大家介紹了Tomcat ClassLoader打破雙親委派源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Kotlin開發(fā)Android應(yīng)用實例詳解

    Kotlin開發(fā)Android應(yīng)用實例詳解

    這篇文章主要介紹了Kotlin開發(fā)Android應(yīng)用實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Spring中任務(wù)調(diào)度之解讀@Scheduled和@Schedules注解的使用

    Spring中任務(wù)調(diào)度之解讀@Scheduled和@Schedules注解的使用

    這篇文章主要介紹了Spring中任務(wù)調(diào)度之解讀@Scheduled和@Schedules注解的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • springboot+HttpInvoke?實現(xiàn)RPC調(diào)用的方法

    springboot+HttpInvoke?實現(xiàn)RPC調(diào)用的方法

    RPC框架大家或多或少都用過,出自于阿里系的就有dubbo,HSF,sofaRPC等,今天通過本文給大家介紹springboot+HttpInvoke?實現(xiàn)RPC調(diào)用的方法,感興趣的朋友一起看看吧
    2022-03-03
  • Spring boot中使用ElasticSearch的方法詳解

    Spring boot中使用ElasticSearch的方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring boot中使用ElasticSearch的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • springboot配置多數(shù)據(jù)源(靜態(tài)和動態(tài)數(shù)據(jù)源)

    springboot配置多數(shù)據(jù)源(靜態(tài)和動態(tài)數(shù)據(jù)源)

    在開發(fā)過程中,很多時候都會有垮數(shù)據(jù)庫操作數(shù)據(jù)的情況,需要同時配置多套數(shù)據(jù)源,本文主要介紹了springboot配置多數(shù)據(jù)源(靜態(tài)和動態(tài)數(shù)據(jù)源),感興趣的可以了解一下
    2023-09-09
  • SpringBoot使用Swagger范例講解

    SpringBoot使用Swagger范例講解

    Swagger是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 Restful 風(fēng)格的 Web 服務(wù)??傮w目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來更新。文件的方法、參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來始終保持同步
    2022-07-07
  • SpringCloud中的Stream服務(wù)間消息傳遞詳解

    SpringCloud中的Stream服務(wù)間消息傳遞詳解

    這篇文章主要介紹了SpringCloud中的Stream服務(wù)間消息傳遞詳解,Stream 就是在消息隊列的基礎(chǔ)上,對其進(jìn)行封裝,可以是我們更方便的去使用,Stream應(yīng)用由第三方的中間件組成,應(yīng)用間的通信通過輸入通道和輸出通道完成,需要的朋友可以參考下
    2024-01-01

最新評論

白玉县| 安义县| 江安县| 桃园市| 东宁县| 宝丰县| 太仓市| 扎鲁特旗| 新巴尔虎右旗| 禄劝| 松溪县| 泰来县| 梁河县| 商城县| 林周县| 抚顺县| 星子县| 寿光市| 萨嘎县| 巴楚县| 嘉定区| 惠东县| 都兰县| 通辽市| 保定市| 大埔县| 吉安市| 桐梓县| 天津市| 剑阁县| 安龙县| 萍乡市| 富川| 佛学| 元朗区| 泰兴市| 海林市| 富顺县| 樟树市| 拜城县| 江孜县|