java 單例設計_Java 之單例設計模式

設計模式: 對問題行之有效的解決方式, 其實它是一種思想.

單例設計模式

解決的問題:就是可以保證一個類在內存中的對象唯一性. 即單個實例.

比如對于A 和 B 兩個程序使用同一個配置信息對象時, A 對配置信息作出修改, B 也與之對應的更新配置信息, 即需要保證該對象的唯一性.

如何保證對象唯一性呢?

不允許其他程序用 new 創建該類對象

在該類中創建一個本類實例

對外提供一個方法讓其他程序可以獲取該對象.

步驟:

私有化該類構造函數

通過 new 在本類中創建一個本類對象

定義一個公有方法, 將創建的對象返回

兩種方式

餓漢式: 類一加載, 對象就存在了.

懶漢式: 類加載進來, 沒有對象, 只有調用 getInstance 方法時, 才會創建對象.

也稱為 單例設計模式的延遲加載模式. 但是, 懶漢式在多線程訪問時,存在安全隱患.

// 第一種方式: 餓漢式

class Single

{

Single s = new Single(); // 在本類中創建一個本類對象

private Single(){} // 私有化該類構造函數

// 定義一個公有方法, 將創建的對象返回. 用于返回對象 s, 所以返回類型 Single

public Single getInstance()

{

return s;

}

}

class SingleDemo

{

public static void main(String[] args)

{

Single ss = Single.getInstance();

}

}

/*

分析一: main 函數中, getInstance 方法調用不能使用對象調用, 只能使用類名調用.

所以 Single 類中該方法需要使用 static 修飾.

分析二: getInstance 方法為靜態方法, 它訪問的內容必須是靜態的,所以對象 s 也需要靜態修飾.

*/

// 改進

class Single

{

private static Single s = new Single();

private Single(){}

public static Single getInstance() // 提供該方法訪問實例對象 s, 是為了對象的可控

{

return s;

}

}

class SingleDemo

{

public static void main(String[] args)

{

Single ss = Single.getInstance();

}

}

// 第二種方式: 懶漢式

// 類加載進來, 沒有對象, 只有調用 getInstance 方法時, 才會創建對象.

class Single2

{

private static Single2 s = null;

private Single(){}

public static Single2 getInstance()

{

if(s==null)

s = new Single2();

return s;

}

}

// 示例:下列代碼的輸出結果

class SingleDemo

{

public static void main(String[] args)

{

Test t1 = Test.getInstance();

Test t2 = Test.getInstance();

t1.setNum(10);

t2.setNum(20);

System.out.println(t1.getNum()); // 輸出 20

System.out.println(t2.getNum()); // 輸出 20

}

}

class Test

{

private int num;

private static Test t = new Test();

private Test(){}

public static Test getInstance()

{

return t;

}

public void setNum(int num)

{

this.num = num;

}

public int getNum()

{

return num;

}

}

// 懶漢式二:避免多線程同時調用getInstance()方法, 可以使用關鍵字synchronized

class LazySingleton {

private static LazySingleton instance = null;

private LazySingleton(){}

public synchronized static LazySingleton getInstance() {

if(instance == null){

instance = new LazySingleton();

}

return instance;

}

}

// 懶漢式三:為提高系統性能,對"instance = new LazySingleton()"進行鎖定

class LazySingleton{

private static LazySingleton instance = null;

private LazySingleton(){}

public static LazySingleton getInstance(){

if(instance == null){ // 此處,有可能造成單例對象不唯一

synchronized(LazySingleton.class){

instance = new LazySingleton();

}

}

return instance;

}

}

// 懶漢式四:雙重檢查鎖定(Double-Check Locking)

class LazySingleton{

// 注意,此處增加修飾符 volatile

private volatile static LazySingleton instance = null;

private LazySingleton(){}

public static LazySingleton getInstance(){

// 第一重判斷

if(instance == null){

// 鎖定代碼塊

synchronized(LazySingleton.class){

// 第二重判斷

if(instance == null){

instance = new LazySingleton();

}

}

}

return instance;

}

}

//單例第三種方式: Initialization Demand Holder(IoDH)技術

// 在單例類中增加一個靜態(static)內部類

class Singleton{

private Singleton(){}

// 靜態類

private static class HolderClass {

private final static Singleton instance = new Singleton();

}

public static Singleton getInstance() {

return HolderClass.instance;

}

public static void main(String args[]){

Singleton s1, s2;

s1 = Singleton.getInstance();

s2 = Singleton.getInstance();

System.out.println(s1 == s2);

}

}

_參考資料_

- [JavaSE 基礎視頻(畢向東)](https://www.bilibili.com/video/av3092292/#page=4)

- [單例模式中的雙重檢查](http://blog.csdn.net/chenchaofuck1/article/details/51702129)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257567.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257567.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257567.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Javascript之RegExp

RegExp對象的構造器 new RegExp(pattern[, flags]) pattern 正則表達式文本flags 該參數可以是下面幾個值的任意組合:g 全局匹配i 忽略大小寫m 讓開始和結束字符(^ 和 $)工作在多行模式(也就是,^ 和 $ 可以匹配字符串中…

DS汽車通過采用沉浸式虛擬現實技術實現展廳轉型

PSA集團(PSA Group)旗下的高端品牌DS汽車公司(DS Automobiles)采用達索系統的“虛擬車庫(Virtual Garage)”行業解決方案為全新的SUV車型DS 7 CROSSBACK提供全面支持,推動其展廳轉型&#xff0c…

java 日歷記事本_calendar 一個用java編寫的日歷記事本. 具有正常日歷功能;也可以用于在不同日期記錄下當日重要的事情 - 下載 - 搜珍網...

日歷記事本/日歷記事本/build/classes/日歷記事本/CalendarPad$1.class日歷記事本/日歷記事本/build/classes/日歷記事本/CalendarPad.class日歷記事本/日歷記事本/build/classes/日歷記事本/Month.class日歷記事本/日歷記事本/build/classes/日歷記事本/NotePad.class日歷記事…

要的需求 ip提取網站源碼帶采集 要求是PHP源碼

求。ip提取網站源碼帶采集 要求是PHP源碼。必須帶采集類似 小峰IP提取網站,安小莫IP提取,迷惘IP提取,冰封IP提取免費類型的 不要淘寶類型的 200 轉載于:https://www.cnblogs.com/PS-apple/p/4342866.html

設計模式之PHP項目應用——單例模式設計Memcache和Redis操作類

1 單例模式簡單介紹 單例模式是一種經常使用的軟件設計模式。在它的核心結構中僅僅包括一個被稱為單例類的特殊類。通過單例模式能夠保證系統中一個類僅僅有一個實例并且該實例易于外界訪問。從而方便對實例個數的控制并節約系統資源。假設希望在系統中某個類的對象僅僅能存…

java 跳轉action_JS 跳轉到指定Action | 學步園

最近項目需要在JS中跳轉到指定的Action。通過不斷的實驗和查資料,終于成功。Java SSH2 架構下,正常 配置Action完畢。在xxx.jsp下window.location" ";例如:window.location" /user/ResAction> ";其中ResAction是配置文…

【轉】康拓展開

———本文轉自:http://www.cnblogs.com/1-2-3/archive/2011/04/25/generate-permutation-part2.html 1、康托展開  康托展開的公式是 Xan*(n-1)!an-1*(n-2)!...ai*(i-1)!...a2*1!a1*0! 其中,ai為當前未出現的元素中是排在第幾個(從0開始&a…

java類排序

1、實現Comparator接口 public static class ComparatorImpl implements Comparator<Element>{Overridepublic int compare(Element o1, Element o2) {if(o1.unitPrice > o2.unitPrice)return 1;else if(o1.unitPrice < o2.unitPrice){return -1;}else{return 0;}}…

java jni so_java 用jni調用so全過程

這幾天一直在研究JNI的開發過程&#xff0c;順便把NDK環境搭建一起總結下。在windows環境下開發jni需要c/c編譯器的支持&#xff0c;網絡上我看很多人使用cygwin。呵呵我不是很喜歡使用它&#xff0c;感覺安裝起來挺麻煩的。我使用GNUStep&#xff0c;下載地址http://www.gnust…

ios開發之 -- 自動輪播圖創建

這里是oc版本的&#xff0c;簡單記錄下&#xff1a; 具體代碼如下&#xff1a; 1&#xff0c;準備 #define FRAME [[UIScreen mainScreen] bounds] #define WIDTH FRAME.size.width #define HEIGHT FRAME.size.height 2&#xff0c;具體實現 //scrollview的添加_bigScrollView…

學習進度(2016.3.13)

第二周所花時間&#xff08;包括上課&#xff09;14小時代碼量&#xff08;行&#xff09;138行博客量&#xff08;篇&#xff09;4篇了解到的知識點動態數組的定義初始化和使用&#xff0c;指定范圍獲得隨機數轉載于:https://www.cnblogs.com/zzcs/p/5272365.html

binaryoperator java_BinaryOperatorT接口的用法示例

java Function函數中的BinaryOperator接口用于執行lambda表達式并返回一個T類型的返回值&#xff0c;下面的BinaryOperator用法示例讓你簡單了解一下。import java.util.function.BinaryOperator;public class TestDemo {public static void main(String[] args) {BinaryOperat…

線性表的順序存儲結構之順序表類的實現_Java

在上一篇博文——線性表接口的實現_Java中&#xff0c;我們實現了線性表的接口&#xff0c;今天讓我們來實現線性表的順序存儲結構——順序表類。 首先讓我們來看下順序表的定義&#xff1a; 線性表的順序存儲是用一組連續的內存單元依次存放線性表的數據元素&#xff0c;元素在…

Linux下安裝jdk

參考于&#xff1a;http://www.cnblogs.com/caosiyang/archive/2013/03/14/2959087.html 一、準備階段 ①下載jdk-6u45-linux-i586.bin&#xff0c;通過xftp上傳至Linux系統中 ②在命令行執行 ./jdk-6u45-linux-i586.bin&#xff0c;生成目錄jdk1.6.0_45 ③移動到/usr/share下&…

JDK source 之 ArrayList 需要注意事項

線程安全 ArrayList內部沒有實現原子性操作&#xff0c;所以是非線程安全的。如果需要在線程安全的環境下使用List的話&#xff0c;需要使用Vector 或者CopyOnWriteArrayList&#xff0c;具體場景&#xff0c;自行深入了解。 擴容算法 // minCapacity 為需要的最小容量 private…

為Tiny4412設備驅動在proc目錄下添加一個可讀版本信息的文件

http://blog.csdn.net/morixinguan/article/details/77808088 上節&#xff0c;我們明白了proc文件系統的作用&#xff0c;接下來我們在友善之臂已經寫好的led驅動的基礎上&#xff0c;在proc目錄下創建一個文件夾&#xff0c;然后加入led驅動的版本信息讀取。 我們在init函數的…

java audiorecord_Android 錄音實現(AudioRecord)

上一篇文章介紹了使用 MediaRecorder 實現錄音功能 Android錄音實現(MediaRecorder) &#xff0c;下面我們繼續看看使用 AudioRecord 實現錄音功能。AudioRecord首先看看Android幫助文檔中對該類的簡單概述: AndioRecord 類的主要功能是讓各種 Java 應用能夠管理音頻資源&#…

SqlServer中的數據類型UniqueIdentifier

SqlServer中的數據類型UniqueIdentifier究竟是什么東東&#xff1f;該類型一般用來做為主鍵使用&#xff0c;可用SQL語法的newid()來生成一個唯一的值。我想請問的是&#xff0c;這個值是一個長整型的數據值呢&#xff0c;還是個其他的什么值&#xff1f;我在程序中該怎樣去控制…

《架構探險——從零開始寫Java Web框架》這書不錯,能看懂的入門書

這書適合我。 哈哈&#xff0c;結合 以前的知識點&#xff0c;勉強能看懂。 講得細&#xff0c;還可以參照著弄出來。 希望能堅持 完成啦。。。 原來&#xff0c;JSTL就類似于DJANGO中的模板。 而servlet類中的res,req&#xff0c;玩了DJANGO就覺得好熟悉啦。。。&#xff1a;&…

java 生成 tar.gz_一文教您如何通過 Java 壓縮文件,打包一個 tar.gz Filebeat 采集器包...

一、背景最近&#xff0c;小哈主要在負責日志中臺的開發工作, 等等&#xff0c;啥是日志中臺&#xff1f;俺只知道中臺概念&#xff0c;這段時間的確很火&#xff0c;但是日志中臺又是用來干啥的&#xff1f;這里小哈盡量地通俗的說下日志中臺的職責&#xff0c;再說日志中臺之…