1. 程式人生 > >單例模式靜態內部類實現執行緒安全。

單例模式靜態內部類實現執行緒安全。

模擬單例的類

package singleton.test;

public class MyObject {

    private MyObject() {
        // TODO Auto-generated constructor stub
    }

    static {
        System.out.println("XXXX");
    }

    /**
     * 內部類實現單例模式
     * 
     * @author cindy
     *
     */
    private static class MyObjectHandle
{
private static MyObject myObject = new MyObject(); static { System.out.println("1234"); } } public static MyObject getInstance() { return MyObjectHandle.myObject; } public static void display() { //測試靜態程式碼塊是否載入 System.out.println("ldjfdfasdfdsfdsff");
} }

測試類

package singleton.test;

public class SingletonTest {

    public SingletonTest() {
        // TODO Auto-generated constructor stub
    }

    static class Mythread extends Thread {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            super
.run(); System.out.println("Singleton hashcode" + MyObject.getInstance()); } } public static void main(String[] args) { Mythread mythread1 = new Mythread(); Mythread mythread2 = new Mythread(); Mythread mythread3 = new Mythread(); // mythread1.start(); //@1 // mythread2.start(); // mythread3.start(); //@2 MyObject myObject = null; myObject.display(); } }

如果將1和2出的程式碼都註釋掉,輸出結果是如圖。說明靜態內部類以及MyObject類都沒有載入,如果載入那麼靜態程式碼塊一定執行。
這裡寫圖片描述

將2段程式碼執行
輸出結果是,說明MyObject靜態程式碼塊執行了,也就說明MyObject類載入到JVM了但是靜態內部類還沒有載入到虛擬機器。
這裡寫圖片描述

將1段程式碼執行看到雜湊碼值是一樣的。說明是單例模式。同時只有getInstance方法執行後靜態內部類才載入到JVM中。也是一種延時載入的實現方法。
這裡寫圖片描述
Java機制規定,內部類 MyObjectHandle只有在getInstance()方法第一次呼叫的時候才會被載入(實現了延遲載入效果),而且其載入過程是執行緒安全的(實現執行緒安全)。內部類載入的時候例項化一次instance。