1. 程式人生 > >Java多執行緒之單例模式-yellowcong

Java多執行緒之單例模式-yellowcong

我們常見的單利模式有餓漢式和懶漢式,懶漢式,就是在用的時候,再例項化物件,餓漢式,是還沒有開飯,就已經把物件例項化好了。在多執行緒開發中,解決單例的時候,有兩種解決方案,1、(懶漢式)同步程式碼塊雙判斷,2、(餓漢式)直接例項化好靜態類,呼叫的時候,直接返回

懶漢式(1、雙判斷,2、同步函式)

1、雙判斷,效率比同步函式高
2、直接給獲取例項化的方法加上同步操作,如果多個物件例項化獲取,效率比較低

package com.yellowcong.queue.demo;

/**
 * 建立日期:2017年10月5日 <br/>
 * 建立使用者:yellowcong <br/>
 * 功能描述:  
 */
public class DoubleSingleton { private static DoubleSingleton ds = null; //直接給獲取例項化的方法加上同步操作 public static synchronized DoubleSingleton getInstance2(){ if(ds == null){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } ds= new
DoubleSingleton(); } return ds; } /** * 建立日期:2017年10月5日<br/> * 建立使用者:yellowcong<br/> * 功能描述:獲取例項 * @return */ public static DoubleSingleton getInstance(){ if(ds == null){ try { Thread.sleep(500); } catch
(InterruptedException e) { e.printStackTrace(); } //業務處理 synchronized (DoubleSingleton.class) { if(ds == null){ ds= new DoubleSingleton(); } } } return ds; } public static void main(String[] args) { new Thread(new Runnable() { public void run() { DoubleSingleton ds= DoubleSingleton.getInstance(); System.out.println(ds.hashCode()); } }).start(); new Thread(new Runnable() { public void run() { DoubleSingleton ds= DoubleSingleton.getInstance(); System.out.println(ds.hashCode()); } }).start(); new Thread(new Runnable() { public void run() { DoubleSingleton ds= DoubleSingleton.getInstance(); System.out.println(ds.hashCode()); } }).start(); } }

餓漢式

物件在呼叫這個類的時候,就例項化好,呼叫getInstance方法的時候,直接返回

package com.yellowcong.queue.demo;

/**
 * 建立日期:2017年10月5日 <br/>
 * 建立使用者:yellowcong <br/>
 * 功能描述:  
 */
public class InnerSingleton {

    private static InnerSingleton ds = new InnerSingleton();

    /**
     * 建立日期:2017年10月5日<br/>
     * 建立使用者:yellowcong<br/>
     * 功能描述:獲取例項
     * @return
     */
    public static  InnerSingleton getInstance(){
        return InnerSingleton.ds;
    }

    public static void main(String[] args) {

        new Thread(new Runnable() {

            public void run() {
                InnerSingleton ds= InnerSingleton.getInstance();
                System.out.println(ds.hashCode());
            }
        }).start();


        new Thread(new Runnable() {

            public void run() {
                InnerSingleton ds= InnerSingleton.getInstance();
                System.out.println(ds.hashCode());
            }
        }).start();


        new Thread(new Runnable() {
            public void run() {
                InnerSingleton ds= InnerSingleton.getInstance();
                System.out.println(ds.hashCode());
            }
        }).start();
    }
}