天天看點

重學Java之單例模式--餓漢式1.單線程:2.多線程

單例模式的典型特征:

  • 隻有一個執行個體;
  • 構造器私有,禁止外部直接使用 new 來建立對象;
  • 對外提供擷取執行個體的方法;

餓漢式單例:類一建立就直接 new 一個對象。

簡單了解就是,很餓,食物一做好就吃(類一建立就new對象)。

好處:立即建立,線程安全。

不足:建立的時候占用記憶體資源,後期沒使用的話就造成資源浪費了。

package single;

import java.util.Arrays;

//餓漢式單例
public class Hungary {

    /**
     * 餓漢式,類加載的時候就直接 new 一個,
     * 占用記憶體空間
     * */
    private static Hungary hungary = new Hungary();

    //構造器私有
    private Hungary(){
        System.out.println(Thread.currentThread().getName() + ", " + toString());
    }

    public static Hungary getInstance(){
        return hungary;
    }
}

           

驗證下:

1.單線程:

package single;

import java.util.Arrays;

//餓漢式單例
public class Hungary {

    /**
     * 餓漢式,類加載的時候就直接 new 一個,
     * 占用記憶體空間
     * */
    private static Hungary hungary = new Hungary();

    //構造器私有
    private Hungary(){
        System.out.println(Thread.currentThread().getName() + ", " + toString());
    }

    public static Hungary getInstance(){
        return hungary;
    }

    public static void main(String[] args) {
        //單線程
        for (int i = 0; i < 5; i++){
            Hungary.getInstance();
        }

        //多線程
        /*for (int i = 0; i < 5; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Hungary.getInstance();
                }
            }).start();
        }*/

    }
}
           

運作結果:

main, [email protected]
           

2.多線程

package single;

import java.util.Arrays;

//餓漢式單例
public class Hungary {

    /**
     * 餓漢式,類加載的時候就直接 new 一個,
     * 占用記憶體空間
     * */
    private static Hungary hungary = new Hungary();

    //構造器私有
    private Hungary(){
        System.out.println(Thread.currentThread().getName() + ", " + toString());
    }

    public static Hungary getInstance(){
        return hungary;
    }

    public static void main(String[] args) {
        //多線程
        for (int i = 0; i < 5; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Hungary.getInstance();
                }
            }).start();
        }
    }
}
           

運作結果:

main, [email protected]