java設計形式之單例形式進修。本站提示廣大學習愛好者:(java設計形式之單例形式進修)文章只能為提供參考,不一定能成為您想要的結果。以下是java設計形式之單例形式進修正文
1 概述
單例形式有幾個利益:
(1)某些類創立比擬頻仍,關於一些年夜型的對象,這是一筆很年夜的體系開支。
(2)省去了new操作符,下降了體系內存的應用頻率,加重GC壓力。
(3)有些類如生意業務所的焦點生意業務引擎,掌握著生意業務流程,假如該類可以創立多個的話,體系完整亂了。
2 詳解
單例形式經常使用的寫法有以下這麼兩種。
2.1 餓漢式
假如運用法式老是創立並應用單例形式,或許在創立和運轉時壓力不是很年夜的情形下,可使用一個公有靜態變量,提早把對象創立好。
package org.scott.singleton;
/**
* @author Scott
* @version 2013-11-16
* @description
*/
public class Singleton1 {
private static Singleton1 uniqueInstance = new Singleton1();
private Singleton1(){
}
public static Singleton1 getInstance(){
return uniqueInstance;
}
}
如許做的話,當JVM加載這個類的時刻,依據初始化的次序,就曾經把對象創立好了。同時,JVM可以包管任何線程在拜訪這個單例對象之前,必定先創立此實例,而且只創立一次。
固然,也能夠應用一個靜態外部類來完成異樣的功效。
package org.scott.singleton;
/**
* @author Scott
* @version 2013-11-16
* @description
*/
public class Singleton2 {
private Singleton2() {
}
/**
* 此處應用一個外部類來保護單例
* */
private static class SingletonFactory {
private static Singleton2 instance = new Singleton2();
}
public static Singleton2 getInstance() {
return SingletonFactory.instance;
}
/**
* 假如該對象被用於序列化,可以包管對象在序列化前後堅持分歧
* */
public Object readResolve() {
return getInstance();
}
}
2.2 兩重鎖方法
“兩重鎖”,望文生義就是兩把鎖,第一把鎖用來檢討要創立的實例對象能否曾經創立了,假如還沒有創立才應用第二把鎖來停止同步。
package org.scott.singleton;
/**
* @author Scott
* @version 2013-11-16
* @description
*/
public class Singleton3 {
private volatile static Singleton3 uniqueInstance;
private Singleton3(){
}
public static Singleton3 getInstance(){
if(uniqueInstance == null){
synchronized(Singleton3.class){
if(uniqueInstance == null){
uniqueInstance = new Singleton3();
}
}
}
return uniqueInstance;
}
}
假如對機能請求比擬高的話,這類方法可以年夜年夜削減創立的時光,今朝來講,這類方法也是比擬通用的一種創立單例的方法。