1. 程式人生 > >淺談java單例模式——優點以及為什麼使用到synchronized

淺談java單例模式——優點以及為什麼使用到synchronized

首先

說一下單例模式的好處:減少系統資源的消耗.因為這種工具類基本上貫穿程式始終,必然會頻繁呼叫.如果每一次呼叫都要重新生成例項,帶來的就是 在記憶體堆中,分配一部分記憶體空間.所以這種模式會提高程式的執行速度,減少資源消耗。

可能對於沒有理解單例模式的小夥伴來說,對這些好處理解不深。看完下面的解說後再感受一下

第一,單例模式的形式有兩種 (餓漢式,懶漢式)
(1)餓漢式

class Single{ 
    private static Single s = Single();

    private Single(){//私有無參構造方法
    }
    private static
Single s = Single(); { return s; } }

(2)懶漢式

class Single {
    private static Single s = null;

    private Single() {
    }

    public static Single getInstance() {
        if (s == null) {//這裡做判斷是為了提高效率
            synchronized (Single.class) {

                if (s == null) {
                    s = new
Single(); } } } return s; } }

有看過java的單例模式的應該大多看到的是(2)懶漢式,因為它的效率更高。下面我們以懶漢式進行解說

第二,通過例項——垃圾回收站 說明單例模式
大家都知道電腦中的垃圾站是吧,大家無論刪除了檔案,圖片,還是視訊等等,都放在了垃圾回收站裡。沒有見過你刪除了一個C盤中的某個檔案,結果這個檔案在D盤冒出來了吧,呵呵。這個垃圾回收站就是單例模式構造的,它自帶刪除操作,其他檔案,圖片,視訊等只要想執行刪除操作就呼叫它,然後這些刪除的東西都放在垃圾箱裡。所以當你刪除了檔案A,又刪除檔案B,開啟垃圾回收站的時候,檔案A和檔案B都在裡面。廢話不多說,程式碼說事:

//垃圾回收站類
public class Recycle{
    private static Recycle rec = null;

    private Recycle(){}

    //獲得物件的靜態方法
    public static Recycle getInstance(){
        if(rec == null){
            synchronized(Recycle.class){//同步鎖
                if(rec == null)
                    rec = new Recycle();
            }
        }
    }
    //表示刪除函式,這裡模擬刪除
    public void delete(String thing){
        System.out.println(thing);
    }
}

//刪除檔案類
public class DeleteFile{
Recycle recy = Recycle.getInstance();
recy.delete(“A已刪除”);
}

//刪除圖片類
public class DeletePicture{
Recycle recy = Recycle.getInstance();
recy.delete(“B圖片被刪除”);
}

看了上面的例子,大家應該對單例模式有了一定的瞭解了吧,再結合它的好處思考一下,是不是有所收穫。

第三,解釋單例模式中的一些疑惑
(1)為什麼用同步鎖
因為在專案中如果有很大的併發量的情況下,有可能造成同時又多個程式執行這個類例項化的方法,因此我們需要在建立類例項化方法的時候新增同步執行。

(2)為甚懶漢模式中要使用兩個if()判斷物件是否為空
第一個判斷,大家應該可以理解。關鍵是第二個if判斷,大家會想第一個if不是已經判斷出物件是否為空了嗎? 現在我拿上面寫的例子來解釋一下,當DeleteFile(用x代替)和DeletePicture(用y代替)同時呼叫Recycle的物件時,此時rec為null,所以 x 和 y 都會經過第一個if判斷,到達同步鎖那裡,其中一個(假設 x)進入到裡面以後,y在鎖(synchronized())外等候,x從鎖裡出來後,rec已經不為null,這時y進入鎖後,如果沒有if判斷rec是否為空,是不是rec又執行了一次new操作,這樣x 和 y都不是同一個物件了。

到這裡,講解就結束了,如有疑問,評論回覆。

相關推薦

java模式——優點以及為什麼使用到synchronized

首先 說一下單例模式的好處:減少系統資源的消耗.因為這種工具類基本上貫穿程式始終,必然會頻繁呼叫.如果每一次呼叫都要重新生成例項,帶來的就是 在記憶體堆中,分配一部分記憶體空間.所以這種模式會提高程式的執行速度,減少資源消耗。 可能對於沒有理解單例模式的小夥

java設計模式模式,模板模式,工廠模式,代理模式

這篇文章講述的是java設計模式,包括單例模式、工廠模式、代理模式,如有錯誤或不當之處,希望各位大神批評指正。 什麼是設計模式? 設計模式:是指在大量的理論和實踐中總結和理論化之後,優選的程式碼結構、程式設計風格、以及解決問題的思考模式。正如數學中的公

Java模式(Singleton)以及實現

一. 什麼是單例模式 因程式需要,有時我們只需要某個類同時保留一個物件,不希望有更多物件,此時,我們則應考慮單例模式的設計。 二. 單例模式的特點 1. 單例模式只能有一個例項。 2. 單例類必須建立自己的唯一例項。 3. 單例類必須向其他物件提供這一例項。 三. 單例模式VS靜態類 在知道了什麼是單例模式後

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

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

Java模式

class auth pre light java on() ack private gets package singleton; /** * 單例模式 * @author pengYi * */ public class Singleton { priva

java模式等一些程序的寫法....持續更新...

new tor zed bsp 更新 餓漢式 blog stat cto 一、單例模式的寫法: public class MyFactory { /** * 餓漢式 */ private static MyFactory instanc

java 模式

多線程安全 except detail 追加 earch 繼承 好處 config 什麽是 單例模式(Singleton)也叫單態模式,是設計模式中最為簡單的一種模式,甚至有些模式大師都不稱其為模式,稱其為一種實現技巧,因為設計模式講究對象之間的關系的抽象,而單例模式只有自

java模式的心得

開發人員 性能 文章 人員 外部 訪問 單例 鎖定 初始化   由於設計模式對於java高級開發人員來說是非常重要的,網上也有很多關於設計模式的文章,博客等。所以,首先我對相對簡單的單例模式做一個簡單的總結。   一、實現方式   單例模式的實現方式有3種,分別是餓漢式

Java模式深入詳解

protected test 異常 except while 深入 bject his 不一致 Java單例模式深入詳解 一.問題引入   偶然想想到的如果把Java的構造方法弄成private,那裏面的成員屬性是不是只有通過static來訪問呢;如果構造方法是privat

Java模式 多種實現方式

main 概念 ron system sta ava 實現 args == 一:通過靜態私有成員實現單例模式 (1):私有化構造函數 (2):new靜態實例屬性對象,加鎖。 單例類: package SinglePag; /* * 構造函數私有化,結合鎖+靜態的概念 實

Java 模式 總結整理

java 單例模式 分享總結常見的5種單例模式: 第一、單例模式的使用場景 A、Windows的任務管理器、回收站、文件系統如F盤,都是很典型的單例模式 ; B、項目中,讀取配置文件的類,一般也是單例模式,沒有必要每次讀取都重新new一個對象加載 C、數據庫的連接池也是

Java - 模式

單例 type youdao 只需要 需要 dao ava 模式 分享圖片 追加說明: ① SingletonHolder的final聲明和SINGLETON的final聲明可以去掉(不去也不會報錯)。 ② 以上實現方式是真單例(線程安全,絕對唯一),一般適用於需要保證絕

java 模式5種寫法

浪費 get public color ring 缺點 threads 構造函數 java 單例模式 學習整理 飽漢模式(懶漢模式) 1 // 飽漢 2 // UnThreadSafe 3 public class Singleton1 { 4 private

Java模式&static成員變量 區別

instance .net 技術分享 static成員 使用 過程 () http 一加 當需要共享的變量很多時,使用static變量占用內存的時間過長,在類的整個生命周期。 而對象只是存在於對象的整個生命周期。 //餓漢式 class Sing

Java-模式

ati 對象實例 get 方式 懶漢 pre sta log style 一、  單例模式:一種常用的軟件設計模式。通過單例模式可以保證系統中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例 二、  應用:線程池、緩存、日誌對象、對話框、打印機、顯卡的驅動程序對

Java 模式的七種寫法

context single ted 永遠 載器 枚舉 有關 urn pub 第一種(懶漢,線程不安全): public class Singleton { private static Singleton instance; private

Java模式幾種實現方式

開始 名稱 常量 就是 多線程開發 靜態代碼塊 浪費 ack 多線程同步 在平時的工作、學員的學習以及面試過程中,單例模式作為一種常用的設計模式,會經常被面試官問到,甚至筆試會要求學員現場默寫,下面將會就單例模式的實現思路和幾種常見的實現方式進行簡單的分享。

java模式(雙重檢查加鎖)的原因

csharp sta get 第一次 instance new 同步機制 原因 AR public class Singleton{ private static Singleton instance = null;//是否是final的不重要,因為最多只可能實

Java模式 volatile關鍵字作用的理解

初始 urn class .com 重新 on() 內存空間 sta 兩個   單例模式是程序設計中經常用到的,簡單便捷的設計模式,也是很多程序猿對設計模式入門的第一節課。其中最經典的一種寫法是: class Singleton { private volatil

淺顯理解Java模式

        單例模式顧名思義,可以理解為只有一個例項存在,它是一種常用的軟體設計模式,在它的核心結構中值包含一個被稱為單例的特殊類。一個類只有一個例項,即一個類只有一個物件例項。         為什麼要有單例模