單例模式靜態內部類實現執行緒安全。
阿新 • • 發佈:2018-12-26
模擬單例的類
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。