1. 程式人生 > >懶漢式模式的執行緒安全問題

懶漢式模式的執行緒安全問題

新建一個單例模式類和一個多執行緒測試類

public class Test24 implements Runnable {  
    public void run() {  
        System.out.println(TestSingleton.getInstance());  
    }  

    public static void main(String[] args) {  
        Test24 test1 = new Test24();  
        Test24 test2 = new Test24();  
        Thread thread1 = new
Thread(test1); Thread thread2 = new Thread(test2); thread1.start(); thread2.start(); } } class TestSingleton { private static TestSingleton testSingleton; private TestSingleton() { System.out.println("建新的物件"); } public static
TestSingleton getInstance() { if (testSingleton == null) { testSingleton = new TestSingleton(); } return testSingleton; } }

執行後發現會產生兩個新的物件。控制檯列印:

建新的物件  
建新的物件  
com.TestSingleton@328d5485  
com.TestSingleton@5ca801b0

說明有執行緒併發訪問安全問題,獲取的不是同一個例項

解決方案(1):同步鎖機制

使用同步鎖機制,最簡單的是在getInstance()方法上加synchronized關鍵字

public static synchronized TestSingleton getInstance() {  
        if (testSingleton == null) {  
            testSingleton = new TestSingleton();  
        }  
        return testSingleton;  
    }

對於這種方式,有人覺得在多併發的情況下,每次獲取例項都要判斷鎖,效率比較低下,所以就有人想出了這樣的辦法,雙重判斷例項,這種大大減少判斷同步鎖的次數了。所以實際使用中可以推廣。

程式碼如下:

public static TestSingleton getInstance() {  
        /* 
         * 如果第一個執行緒獲取到了單例的例項物件, 後面的執行緒再獲取例項的時候不需要進入同步程式碼塊中了 
         */  
        if (testSingleton == null) {  
            // 同步程式碼塊用的鎖是單例的位元組碼檔案物件,且只能用這個鎖  
            synchronized (TestSingleton.class) {  
                if (testSingleton == null) {  
                    testSingleton = new TestSingleton();  
                }  
            }  
        }  
        return testSingleton;  
    }

解決方案(2):改懶漢式為餓漢式單例模式

餓漢式:

public class Singleton {
    // 把"唯一的"物件儲存在單例類的屬性裡
    private static Singleton instance = new Singleton();

    // 構造器私有化,不能在類的外部隨意建立物件
    private Singleton(){}

    // 提供一個全域性的訪問點來獲得這個"唯一"的物件
    public static Singleton getInstance(){
        return instance;
    }
}

懶漢式模式類載入的時候就建立物件。

相關推薦

java設計模式(一)建立型模式之 單例模式(餓漢式,懶漢式執行安全,雙重檢查)

1.介紹     單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。  2.實現思路與步驟   1).將該類的構造方法定義為私有方法,這樣其他處的程式碼就無法通過呼叫該類的構造方法來例項化該類的物件,只有通過該類提供的靜態

Java 單例模式執行安全問題

Java 單例模式執行緒安全問題  更新時間:2017年09月14日 11:30:42   作者:flycw    我要評論   這篇文章主要介紹了Java 單例模式執行緒安全問題的相關資料,希望通過本文大家能瞭解掌握單例模式中

面試題剖析:單例設計模式執行安全問題

本文作者:黃海燕,叩丁狼高階講師。原創文章,轉載請註明出處。 1. volatile 關鍵字 1.1 volatile 關鍵字作用: 在百度百科擷取的描述如下: 叩丁狼教育.png 說明volatile 關鍵字作用作用有兩點: 防止指令重

java單例模式執行安全

關於單例模式的文章,其實網上早就已經氾濫了。但一個小小的單例,裡面卻是有著許多的變化。網上的文章大多也是提到了其中的一個或幾個點,很少有比較全面且脈絡清晰的文章,於是,我便萌生了寫這篇文章的念頭。企圖把這個單例說透,說深入。但願我不會做的太差。   首先來看一個典型的實

設計模式之單例模式(執行安全)

可以說單例模式是所有設計模式中最簡單的一種。 單例模式就是說系統中對於某類的只能有一個物件,不可能出來第二個。 單例模式也是23中設計模式中在面試時少數幾個會要求寫程式碼的模式之一。主要考察的是多執行緒下面單例模式的執行緒安全性問題。 1.多執行緒安全單例模式例項一(不使用同步鎖) 1 public c

單例模式懶漢式及其中的執行安全問題

先看程式碼: package com.roocon.thread.t5; public class Singleton2 { private Singleton2(){ } private static Singleton2 instan

java單例模式並解決懶漢式執行安全的問題

單例模式中分為懶漢式和餓漢式 其中,懶漢式是執行緒不安全的,當有多條執行緒同時訪問單例物件時,則會出現多執行緒臨界資源問題。 現在用多執行緒實現並解決執行緒安全問題 餓漢式 public class SigletonDemo01 { static Ha

單例模式懶漢式和餓漢式)及如何實現執行安全

單例模式有兩種:懶漢式和餓漢式。 1 #include <iostream> 2 3 using namespace std; 4 5 6 // 保證在整個程式執行期間,最多隻能有一個物件例項 7 8 9 // 懶漢式 10 // 1 、建構函式私有化 11

單例設計模式(餓漢式,懶漢式(1,有執行安全問題,2,安全高效))

package cn.itcast.mobilesafexian2.test; public class Student { /* (1)單例模式(只需建立一個物件) (外界訪問直接Student.getStudent 即可獲得物件 ) (餓漢式:在載入的時候建立物件{

單例設計模模式——懶漢式為什麼執行安全

單例設計模式分為兩種餓漢式,懶漢式無論哪一種,思想就三步,0;就一個例項,則不能被例項化,所有建構函式私有的1:提供一個例項2:提供一個供外部訪問的方法懶漢式執行緒不安全,那為什麼不安全呢?看程式碼!!! 假設開始執行緒0進入,判斷instance為空,在將要建立例項時,

懶漢式模式執行安全問題

新建一個單例模式類和一個多執行緒測試類 public class Test24 implements Runnable { public void run() { System.out.println(TestSinglet

簡單java單例模式 懶漢式、餓漢式以及解決執行安全問題(synchronized)

單例模式(又稱設計模式) 一個類只存一個物件(例項)。 單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界訪問,從而方便對例項個數額控制並節約系統資源。如果希望在系統中某個類的物件

Qt中實現執行安全的單例模式

之前專案中用到單例模式,用的是執行緒不安全的,這次專案用到了多執行緒,所以想到實現一個執行緒安全的單例模式。經過查詢資料,發現Qt本身有自己的執行緒安全單例模式實現方式。 Q_GLOBAL_STATIC巨集 使用方法:MonitorWindow.h #ifndef MONITORW

設計模式之單例模式【內附物件例項化幾種方式、實現執行安全幾種方式】

繼續來複習常用的設計模式-單例模式,順便回憶一下執行緒安全的幾種實現方式。 一、什麼是單例模式 單例模式,簡單常用的一種設計模式,也很好的體現了程式碼控制物件在記憶體數量的一種方式,主要分2種實現方式: ①餓漢式,執行緒安全 ②懶漢式,執行緒不安全(新增鎖機制,可以實現執行緒安全)

執行安全單例設計模式+序列化

懶漢式單例模式會引來執行緒安全問題,即多執行緒時可能會建立多個例項,而且在反序列化時也可能會建立新的例項。看了大大們的實現方式,覺得以下一種比較簡單方便理解。 一、下面是會造成執行緒安全的餓漢單例模式。用四列印下會發現hashcode不一致 public class Singleton {

Java中執行安全的單例模式

Java中執行緒安全的單例 深入研究Servlet執行緒安全性問題 來源:網路整理 作者:2017年12月01日 14:03 0 分享 訂閱 關鍵詞:Servlet執行緒     Servlet(Server Applet)是Java Servle

Java併發程式設計(3)-構造執行安全類的模式

文章目錄 一、例項限制模式 1.1、 限制變數確保執行緒安全 1.2、分析ArrayList的執行緒安全性 1.3、總結 二、委託執行緒安全模式 2.

C++設計一個執行安全的懶漢單例模式

#incldue<iostream> #include<mutex> using namespace std; class CSingleton { public: static CSingleton* GetCSingleton() { if (_p ==

python中單例模式執行安全問題

看了好多文章都是java實現的,特此寫一篇python的。 這個問題的兩種解決方案: 1.最簡單粗暴的就是在系統中先生成一個單例,就不存線上程安全問題了 2.用雙重同步鎖去實現,一把鎖加外面,一把鎖加里面: class Singleton(object): __instance

懶漢式單例--雙重檢測鎖實現執行安全

Football2.java /** * 懶漢式單例 * 用的時候再建立一個物件,執行緒不安全 * @author Administrator * */ class FootBall2 { private static int count; privat