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

完美解決單例設(shè)計模式中懶漢式線程安全的問題

 更新時間:2016年12月27日 11:23:57   投稿:jingxian  
下面小編就為大家?guī)硪黄昝澜鉀Q單例設(shè)計模式中懶漢式線程安全的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

首先寫個單例:

public class SingleDemo { 
  private static SingleDemo s = null; 
  private SingleDemo(){} 
  public static SingleDemo getInstance(){ 
    if(s == null){ 
      s = new SingleDemo(); 
    } 
    return s; 
  } 
} 

寫個測試類:

public class ThreadDemo3 { 
   
  public static void main(String[] args) { 
    SingleDemo s1 = SingleDemo.getInstance(); 
    SingleDemo s2 = SingleDemo.getInstance(); 
    System.out.println(s2 == s2); 
  } 
} 

運(yùn)行結(jié)果一直都是true,說明單線程下是沒問題的,下面寫個多線程來訪問單例

public class ThreadTest implements Runnable { 
  //存放單例對象,使用Set是為了不存放重復(fù)元素 
  public Set<SingleDemo> singles = new HashSet<SingleDemo>(); 
  @Override 
  public void run() { 
    //獲取單例 
    SingleDemo s = SingleDemo.getInstance(); 
    //添加單例 
    singles.add(s); 
  } 
} 

使用多線程并發(fā)訪問單例:

public class ThreadDemo3 { 
   
  public static void main(String[] args) { 
//   SingleDemo s1 = SingleDemo.getInstance(); 
//   SingleDemo s2 = SingleDemo.getInstance(); 
//   System.out.println(s2 == s2); 
    ThreadTest t = new ThreadTest(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    System.out.println(t.singles); 
  } 
} 


運(yùn)行結(jié)果如下:
[com.persagy.thread.SingleDemo@1bc4459, com.persagy.thread.SingleDemo@150bd4d]

[com.persagy.thread.SingleDemo@12b6651]

說明有線程并發(fā)訪問安全問題,獲取的不一定都是同一個實例

如何解決線程安全問題呢?

當(dāng)然使用同步鎖機(jī)制了啊

下面改進(jìn)單例:

public class SingleDemo {
	private static SingleDemo s = null;
	private SingleDemo(){}
	public static synchronized SingleDemo getInstance(){
		if(s == null){
			s = new SingleDemo();
		}
		return s;
	}
}

加入同步函數(shù)后線程安全問題解決了

運(yùn)行多次都是獲取同一個實例,不會出現(xiàn)2個實例的情況了

[com.persagy.thread.SingleDemo@12b6651]

但是在多線程并發(fā)訪問的情況下,每個線程每次獲取實例都要判斷下鎖,效率比較低,為了提高效率,我加入了雙重判斷的方法,解決了效率的問題

代碼如下:

public class SingleDemo {
	private static SingleDemo s = null;
	private SingleDemo(){}
	public static SingleDemo getInstance(){
		/*如果第一個線程獲取到了單例的實例對象,
		 * 后面的線程再獲取實例的時候不需要進(jìn)入同步代碼塊中了*/
		if(s == null){
			//同步代碼塊用的鎖是單例的字節(jié)碼文件對象,且只能用這個鎖
			synchronized(SingleDemo.class){
				if(s == null){
					s = new SingleDemo();
				}
			}
		}
		return s;
	}
}

用這種方式解決了懶漢式的線程安全問題,也提高了效率,但是在實際開發(fā)中還是用餓漢式的比較多,畢竟這個代碼比較多,比較繁瑣。

以上就是小編為大家?guī)淼耐昝澜鉀Q單例設(shè)計模式中懶漢式線程安全的問題全部內(nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

  • Redisson可重入鎖解鎖邏輯詳細(xì)講解

    Redisson可重入鎖解鎖邏輯詳細(xì)講解

    Redisson開源框架是一個Redis的分布式鎖的現(xiàn)成實現(xiàn)方案,是Redis的java實現(xiàn)的客戶端。通過Netty支持非阻塞I/O。Redisson實現(xiàn)了分布式鎖的自動續(xù)期機(jī)制、鎖的互斥自等待機(jī)制、鎖的可重入加鎖與釋放鎖的機(jī)制
    2023-02-02
  • Spring Boot利用Thymeleaf發(fā)送Email的方法教程

    Spring Boot利用Thymeleaf發(fā)送Email的方法教程

    spring Boot默認(rèn)就是使用thymeleaf模板引擎的,下面這篇文章主要給大家介紹了關(guān)于在Spring Boot中利用Thymeleaf發(fā)送Email的方法教程,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • JUnit5中的參數(shù)化測試實現(xiàn)

    JUnit5中的參數(shù)化測試實現(xiàn)

    參數(shù)化測試使得我們可以使用不同的參數(shù)運(yùn)行同一個測試方法,從而減少我們編寫測試用例的工作量,本文主要介紹了JUnit5中的參數(shù)化測試實現(xiàn),感興趣的可以了解一下
    2023-05-05
  • 深入Spring Boot實現(xiàn)對Fat Jar jsp的支持

    深入Spring Boot實現(xiàn)對Fat Jar jsp的支持

    這篇文章主要介紹了深入Spring Boot實現(xiàn)對Fat Jar jsp的支持,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Maven下 mybatis-generator使用

    Maven下 mybatis-generator使用

    這篇文章主要介紹了Maven下 mybatis-generator使用 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • Java 客戶端操作 FastDFS 實現(xiàn)文件上傳下載替換刪除功能

    Java 客戶端操作 FastDFS 實現(xiàn)文件上傳下載替換刪除功能

    這篇文章主要介紹了Java 客戶端操作 FastDFS 實現(xiàn)文件上傳下載替換刪除功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • java面向?qū)ο蟮娜筇匦灾焕^承用法實例分析

    java面向?qū)ο蟮娜筇匦灾焕^承用法實例分析

    這篇文章主要介紹了java面向?qū)ο蟮娜筇匦灾焕^承用法,結(jié)合實例形式分析了java面向?qū)ο蟪绦蛟O(shè)計中繼承的基本原理與具體使用方法,需要的朋友可以參考下
    2019-11-11
  • Springboot整合Mybatis傳值的常用方式總結(jié)

    Springboot整合Mybatis傳值的常用方式總結(jié)

    今天給大家?guī)淼氖顷P(guān)于Springboot的相關(guān)知識,文章圍繞著Springboot整合Mybatis傳值的常用方式展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 簡單了解JAVA變量類型及代碼實例

    簡單了解JAVA變量類型及代碼實例

    這篇文章主要介紹了簡單了解JAVA變量類型及代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • java控制Pdf自動打印的小例子

    java控制Pdf自動打印的小例子

    java控制Pdf自動打印的小例子,需要的朋友可以參考一下
    2013-04-04

最新評論