溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java反射與單例設計模式實例介紹

發(fā)布時間:2021-08-31 14:27:01 來源:億速云 閱讀:138 作者:chen 欄目:編程語言

本篇內容介紹了“java反射與單例設計模式實例介紹”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

反射與單例設計模式

單例設計模式的核心本質在于:類內部的構造方法私有化,在類的內部產生實例化對象后通過static方法獲取實例化對象,進行類中的結構調用,單例設計模式一共有兩類:懶漢式、餓漢式,本節(jié)主要來討論懶漢式的單例設計模式。

范例:觀察懶漢式單例設計模式的問題
單線程狀態(tài)執(zhí)行:

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Singleton sinA = Singleton.getInstance();
        sinA.print();
    }
}
class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {if (instance == null) {            instance = new Singleton();
        }
        return instance;    }
    public void print() {
        System.out.println("www.mldn.cn");
    }
}

多線程狀態(tài)執(zhí)行:

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {for (int x = 0; x < 3; x++) {new Thread(()->{
                Singleton.getInstance().print();
            },"單例消費端-"+ x).start();
        }/**         * 【單例消費端-0】****** 實例化Singleton類對象 *******         * 【單例消費端-1】****** 實例化Singleton類對象 *******         * www.mldn.cn         * 【單例消費端-2】****** 實例化Singleton類對象 *******         * www.mldn.cn         * www.mldn.cn         */}
}class Singleton {
    private static Singleton instance = null;
    private Singleton() {
        System.out.println("【" + Thread.currentThread().getName() +"】****** 實例化Singleton類對象 *******",Thread.currentThread().getName());
    }
    public static Singleton getInstance() {if (instance == null) {
            instance = new Singleton();
        }return instance;
    }
    public void print() {
        System.out.println("www.mldn.cn");
    }
}

單例設計模式的最大特點是在整體的運行程序中只允許產生一個實例化對象,但當有了若干個線程之后,實際上當前的程序就會產生多個實例化對象了,此時就不是單例設計模式了。此時問題造成的關鍵在于代碼本身出現了不同步的情況,而要想解決的關鍵就在于同步處理,也就是需要使用synchronized關鍵字。

java反射與單例設計模式實例介紹
單例設計模式問題

范例:修改getInstance()進行同步處理

class Singleton {
    private static Singleton instance = null;
    private Singleton() {
        System.out.println("【" + Thread.currentThread().getName() +"】****** 實例化Singleton類對象 *******",Thread.currentThread().getName());
    }
    public static synchronized Singleton getInstance() {if (instance == null) {            instance = new Singleton();
        }
        return instance;    }
    public void print() {
        System.out.println("www.mldn.cn");
    }
}

這個時候的確是進行了同步處理,但這個同步處理的代價有些大,因為效率會低。因為整體代碼中實際上只有一塊部分需要進行同步處理,也就是instance對象的實例化處理部分。我們可以知道,之前的同步操作是有些失誤的。

范例:更加合理地進行同步處理

class Singleton {
    private static volatile Singleton instance = null;
    private Singleton() {
        System.out.printf("【" + Thread.currentThread().getName() +"】****** 實例化Singleton類對象 *******",Thread.currentThread().getName());
    }
    public static Singleton getInstance() {if (instance == null) {
            synchronized (Singleton.class) {if (instance == null) {                    instance = new Singleton();
                }
            }
        }
        return instance;    }
    public void print() {
        System.out.println("www.mldn.cn");
    }
}

“java反射與單例設計模式實例介紹”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI