Java單例模式怎么寫

本篇內(nèi)容主要講解“Java單例模式怎么寫”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java單例模式怎么寫”吧!

創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元林州做網(wǎng)站,已為上家服務(wù),為林州各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575

這個(gè)模式是很有意思,而且比較簡單,但是我還是要說因?yàn)樗褂玫氖侨绱说膹V泛,如此的有人緣,單例就是單一、獨(dú)苗的意思,那什么是獨(dú)一份呢?你的思維是獨(dú)一份,除此之外還有什么不能山寨的呢?我們舉個(gè)比較難復(fù)制的對象:皇帝

中國的歷史上很少出現(xiàn)兩個(gè)皇帝并存的時(shí)期,是有,但不多,那我們就認(rèn)為皇帝是個(gè)單例模式,在這個(gè)場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應(yīng)該和昨天、前天的一樣(過渡期的不考慮,別找茬哦),大臣磕完頭,抬頭一看,嗨,還是昨天那個(gè)皇帝,單例模式,絕對的單例模式,先看類圖:

然后我們看程序?qū)崿F(xiàn),先定一個(gè)皇帝:

package com.cbf4life.singleton1;


/**
*中國的歷史上一般都是一個(gè)朝代一個(gè)皇帝,有兩個(gè)皇帝的話,必然要PK出一個(gè)皇帝出來
*/

public class Emperor {
       private static Emperor emperor = null;	//定義一個(gè)皇帝放在那里,然后給這個(gè)皇帝名字
       private Emperor(){
        //世俗和道德約束你,目的就是不讓你產(chǎn)生第二個(gè)皇帝
        }
        public static Emperor getInstance(){
            if(emperor == null){	//如果皇帝還沒有定義,那就定一個(gè)
                emperor = new Emperor();
            }
            return emperor;
        }

    //皇帝叫什么名字呀
    public static void emperorInfo(){
        System.out.println("我就是皇帝某某某....");
    }

}

然后定義大臣:

package com.cbf4life.singleton1;
/**
*大臣是天天要面見皇帝,今天見的皇帝和昨天的,前天不一樣那就出問題了!
*/

@SuppressWarnings("all")
public class Minister {
        public static void main(String[] args) {
            //第一天
            Emperor	emperor1=Emperor.getInstance();
            emperor1.emperorInfo();	//第一天見的皇帝叫什么名字呢?

            //第二天
            Emperor emperor2=Emperor.getInstance(); Emperor.emperorInfo();

            //第三天
            Emperor emperor3=Emperor.getInstance(); emperor2.emperorInfo();
            //三天見的皇帝都是同一個(gè)人,榮幸吧!
        }
}

看到?jīng)],大臣天天見到的都是同一個(gè)皇帝,不會(huì)產(chǎn)生錯(cuò)亂情況,反正都是一個(gè)皇帝,是好是壞就這一個(gè),只要提到皇帝,大家都知道指的是誰,清晰,而又明確。問題是這是通常情況,還有個(gè)例的,如同一個(gè)時(shí)期同一個(gè)朝代有兩個(gè)皇帝,怎么辦?

單例模式很簡單,就是在構(gòu)造函數(shù)中多了加一個(gè)構(gòu)造函數(shù),訪問權(quán)限是 private 的就可以了,這個(gè)模式是簡單,但是簡單中透著風(fēng)險(xiǎn),風(fēng)險(xiǎn)?什么風(fēng)險(xiǎn)?在一個(gè) B/S 項(xiàng)目中,每個(gè) HTTP Request 請求到 J2EE 的容器上后都創(chuàng)建了一個(gè)線程,每個(gè)線程都要?jiǎng)?chuàng)建同一個(gè)單例對象,怎么辦?,好,我們寫一個(gè)通用的單例程序,然后分析一下:

package com.cbf4life.singleton3;
/**
*通用單例模式
*/
@SuppressWarnings("all")
    public class SingletonPattern {
        private static SingletonPattern singletonPattern= null;
        //限制住不能直接產(chǎn)生一個(gè)實(shí)例
        private SingletonPattern(){
        }

        public SingletonPattern getInstance(){
            if(this.singletonPattern == null){	//如果還沒有實(shí)例,則創(chuàng)建一個(gè)
                this.singletonPattern = new SingletonPattern();
            }
            return this.singletonPattern;
        }
}

我們來看黃色的那一部分,假如現(xiàn)在有兩個(gè)線程 A 和線程 B,線程 A 執(zhí)行到 this.singletonPattern = new SingletonPattern(),正在申請內(nèi)存分配,可能需要 0.001 微秒,就在這 0.001 微秒之內(nèi),線程 B 執(zhí)行到 if(this.singletonPattern == null),你說這個(gè)時(shí)候這個(gè)判斷條件是 true 還是 false?是 true,那然后呢?線程 B 也往下走,于是乎就在內(nèi)存中就有兩個(gè) SingletonPattern 的實(shí)例了,看看是不是出問題了?

如果你這個(gè)單例是去拿一個(gè)序列號(hào)或者創(chuàng)建一個(gè)信號(hào)資源的時(shí)候,會(huì)怎么樣?業(yè)務(wù)邏輯混亂!數(shù)據(jù)一致性校驗(yàn)失敗!最重要的是你從代碼上還看不出什么問題,這才是最要命的!因?yàn)檫@種情況基本上你是重現(xiàn)不了的,不寒而栗吧,那怎么修改?有很多種方案,我就說一種,能簡單的、徹底解決問題的方案:

package com.cbf4life.singleton3;
/**
*通用單例模式
*/
@SuppressWarnings("all")
    public class SingletonPattern {
        private static final SingletonPattern singletonPattern= new   SingletonPattern();

        //限制住不能直接產(chǎn)生一個(gè)實(shí)例
        private SingletonPattern(){
        }

        public synchronized static SingletonPattern getInstance(){ return singletonPattern;
        }
}

直接 new 一個(gè)對象傳遞給類的成員變量 singletonpattern,你要的時(shí)候 getInstance()直接返回給你,解決問題!

到此,相信大家對“Java單例模式怎么寫”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)頁標(biāo)題:Java單例模式怎么寫
鏈接地址:http://bm7419.com/article38/pscosp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站面包屑導(dǎo)航、品牌網(wǎng)站制作外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)