<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    日出星辰

    各種創(chuàng)建單例模式的優(yōu)缺點

    單例模式應(yīng)用于一個類只有一個實例的情況,并且為其實例提供一個全局的訪問點。

    特點

    1.一個類只有一個實例

    2.自己創(chuàng)建這個實例

    3.整個系統(tǒng)只能用這個實例

    應(yīng)用場景

    外部資源:每臺計算機有若干個打印機,但只能有一個PrinterSpooler,以避免兩個打印作業(yè)同時輸出到打印機。

    內(nèi)部資源:大多數(shù)軟件都有一個(或多個)屬性文件存放系統(tǒng)配置,這樣的系統(tǒng)應(yīng)該有一個對象管理這些屬性文件。

    實現(xiàn)方式

    1.餓漢式:單例實例在類裝載時就構(gòu)建,急切初始化。(預(yù)先加載法)

    /**
     * 餓漢式(推薦)
     *
     */
    public class Singleton1 {
    
    	private Singleton1() {
    	}
    
    	public static Singleton1 instance = new Singleton1();
    
    	public Singleton1 getInstance() {
    		return instance;
    	}
    
    }

    優(yōu)點 1.線程安全
    2.在類加載的同時已經(jīng)創(chuàng)建好一個靜態(tài)對象,調(diào)用時反應(yīng)速度快
    缺點 資源效率不高,可能getInstance()永遠不會執(zhí)行到,但執(zhí)行該類的其他靜態(tài)方法或者加載了該類(class.forName),那么這個實例仍然初始化

     

    2.懶漢式:單例實例在第一次被使用時構(gòu)建,延遲初始化。

    class Singleton2 {
    	private Singleton2() {
    	}
    
    	public static Singleton2 instance = null;
    
    	public static Singleton2 getInstance() {
    		if (instance == null) {
                  //多個線程判斷instance都為null時,在執(zhí)行new操作時多線程會出現(xiàn)重復(fù)情況
    			instance = new Singleton2();
    		}
    		return instance;
    	}
    }

    懶漢式在單個線程中沒有問題,但在多線程就可能會出現(xiàn)兩個或多個Singleton2實例情況,

    雖然后面實例化的Singleton2會覆蓋前面實例化的Singleton2,但最好避免這樣的情況。

    改進方式就是加鎖synchornized

    class Singleton3 {
    	private Singleton3() {
    	}
    
    	public static Singleton3 instance = null;
    
    	public static synchronized Singleton3 getInstance() {
    		if (instance == null) {
    			instance = new Singleton3();
    		}
    		return instance;
    	}
    }
    優(yōu)點 資源利用率高,不執(zhí)行g(shù)etInstance()就不會被實例,可以執(zhí)行該類的其他靜態(tài)方法
    缺點 第一次加載時不夠快,多線程使用不必要的同步開銷大


    3.雙重檢測

    class Singleton4 {
    	private Singleton4() {
    	}
    
    	public static Singleton4 instance = null;
    
    	public static Singleton4 getInstance() {
    		if (instance == null) {
    			synchronized (Singleton4.class) {
    				if (instance == null) {
    					instance = new Singleton4();
    				}
    			}
    		}
    		return instance;
    	}
    }

    優(yōu)點 資源利用率高,不執(zhí)行g(shù)etInstance()就不被實例,可以執(zhí)行該類其他靜態(tài)方法
    缺點 第一次加載時反應(yīng)不快,由于java內(nèi)存模型一些原因偶爾失敗

     

    4.靜態(tài)內(nèi)部類

    class Singleton5 {
    	private Singleton5() {
    	}
    
    	private static class SingletonHelp {
    		static Singleton5 instance = new Singleton5();
    	}
    
    	public static Singleton5 getInstance() {
    		return SingletonHelp.instance;
    	}
    }

    優(yōu)點 資源利用率高,不執(zhí)行g(shù)etInstance()不被實例,可以執(zhí)行該類其他靜態(tài)方法
    缺點 第一次加載時反應(yīng)不夠快

     

    總結(jié):一般采用餓漢式(1),若對資源十分在意可以采用靜態(tài)內(nèi)部類(4),不建議采用懶漢式及雙重檢測(2、3)

    另外

    對于第二種可以采用volatile方式

    volatile用更低的代價代替同步

    解釋:同步的代價主要有覆蓋范圍決定,如果可以降低同步的覆蓋范圍,可大幅提升性能。

    而volatile覆蓋范圍是變量級別的,因此同步代價很低。

    volatile原理:告訴處理器,不要將其放入工作內(nèi)存,而是直接在主存操作。因此,當多處理器或多線程在訪問該變量時

    都將直接操作主存,這在本質(zhì)上做到了變量共享。

    volation優(yōu)勢:

    1.更大的程度吞吐量

    2.更少的代碼實現(xiàn)多線程

    3.程序伸縮性好

    4.比較好理解,無需太高的學(xué)習成本

    volatile不足:

    1.容易出問題

    2.比較難設(shè)計

    參考文獻

    http://yiminghe.iteye.com/blog/404334

    http://developer.51cto.com/art/201103/249322.htm

    posted on 2011-09-05 21:54 日出星辰 閱讀(3385) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲成a人片在线观看天堂无码| 一级做a爰性色毛片免费| 女人18毛片水真多免费播放| 国产亚洲美女精品久久| 日本亚洲成高清一区二区三区 | 69免费视频大片| 亚洲熟妇丰满xxxxx| 亚洲色精品aⅴ一区区三区| 亚洲免费一级视频| 日本精品久久久久久久久免费| 亚洲大片在线观看| 国产人妖ts在线观看免费视频| a级男女仿爱免费视频| 亚洲中文字幕无码亚洲成A人片| 国产亚洲大尺度无码无码专线 | 最近中文字幕mv手机免费高清| 精品久久久久久无码免费| 日本亚洲精品色婷婷在线影院| 国产亚洲精品国产| 无码国模国产在线观看免费| 99在线观看视频免费| 一级中文字幕免费乱码专区| 亚洲香蕉久久一区二区| 亚洲成AV人片在线观看无码| 国产精品免费看久久久无码| 最近2019免费中文字幕6| 国产成人1024精品免费| 亚洲精品国产av成拍色拍| 久久丫精品国产亚洲av不卡| 亚洲色偷拍区另类无码专区| 四虎影视www四虎免费| 3d动漫精品啪啪一区二区免费| sihu国产精品永久免费| 老子影院午夜伦不卡亚洲| 亚洲乱码卡三乱码新区| 久久精品国产亚洲AV麻豆不卡| 亚洲午夜福利精品久久| 在线免费观看韩国a视频| 歪歪漫画在线观看官网免费阅读| 久久免费高清视频| 成人无码a级毛片免费|