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

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

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

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

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

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

滯后初始化。滯后初始化單例對(duì)象有兩個(gè)理由:

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

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

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

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

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

1,餓漢式單例類

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

 private static Singleton1 instance = new Singleton1();

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

2,懶漢式單例類

public class Singleton2 {

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

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

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

因此改變代碼如下:

public class Singleton3 {

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

}

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

 volatile, 用更低的代價(jià)替代同步

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

而volatile的覆蓋范圍僅僅變量級(jí)別的. 因此它的同步代價(jià)很低.

volatile原理是什么?

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

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

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

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

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

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

public class Singleton4 {
 private static volatile Singleton4 instance;
 /** *//**
 * 雙重加鎖實(shí)現(xiàn)多線程運(yù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)文章

  • 與眾不同的 Java 日期格式化大全

    與眾不同的 Java 日期格式化大全

    這篇文章主要介紹了與眾不同的 Java 日期格式化大全,在 Java 中,經(jīng)常要將時(shí)間字符串轉(zhuǎn)換為日期,或者要將日期轉(zhuǎn)換為時(shí)間字符串。,需要的朋友可以參考下
    2019-06-06
  • SpringBoot讀取多環(huán)境配置文件的幾種方式

    SpringBoot讀取多環(huán)境配置文件的幾種方式

    這篇文章主要給大家介紹了SpringBoot讀取多環(huán)境配置文件的幾種方式,文章通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-10-10
  • 利用?SpringBoot?在?ES?中實(shí)現(xiàn)類似連表查詢功能

    利用?SpringBoot?在?ES?中實(shí)現(xiàn)類似連表查詢功能

    這篇文章主要介紹了如何利用?SpringBoot?在?ES?中實(shí)現(xiàn)類似連表的查詢功能,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Java高級(jí)用法中的JNA類型映射注意細(xì)節(jié)及使用問題

    Java高級(jí)用法中的JNA類型映射注意細(xì)節(jié)及使用問題

    本文介紹了在使用JNA方法映射中應(yīng)該注意的一些細(xì)節(jié)和具體的使用問題,對(duì)java??JNA類型映射注意細(xì)節(jié)感興趣的朋友一起看看吧
    2022-04-04
  • Spring中的@Lazy注解用法實(shí)例

    Spring中的@Lazy注解用法實(shí)例

    這篇文章主要介紹了Spring中的@Lazy注解用法實(shí)例,在Spring中常用于單實(shí)例Bean對(duì)象的創(chuàng)建和使用,單實(shí)例Bean懶加載容器啟動(dòng)后不創(chuàng)建對(duì)象,而是在第一次獲取Bean創(chuàng)建對(duì)象時(shí),初始化,需要的朋友可以參考下
    2023-08-08
  • 深入解析Java中volatile關(guān)鍵字的作用

    深入解析Java中volatile關(guān)鍵字的作用

    Java語言是支持多線程的,為了解決線程并發(fā)的問題,在語言內(nèi)部引入了 同步塊 和 volatile 關(guān)鍵字機(jī)制
    2013-09-09
  • Java監(jiān)聽器ActionListener與MouseListener的執(zhí)行順序說明

    Java監(jiān)聽器ActionListener與MouseListener的執(zhí)行順序說明

    這篇文章主要介紹了Java監(jiān)聽器ActionListener與MouseListener的執(zhí)行順序說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 修改maven本地倉庫路徑的方法

    修改maven本地倉庫路徑的方法

    本篇文章主要介紹了修改maven本地倉庫路徑的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • springboot?aop配合反射統(tǒng)一簽名驗(yàn)證實(shí)踐

    springboot?aop配合反射統(tǒng)一簽名驗(yàn)證實(shí)踐

    這篇文章主要介紹了springboot?aop配合反射統(tǒng)一簽名驗(yàn)證實(shí)踐,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 關(guān)于Java集合框架的總結(jié)

    關(guān)于Java集合框架的總結(jié)

    下面小編就為大家?guī)硪黄P(guān)于Java集合框架的總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05

最新評(píng)論