基本單例模式實現
模式目的:通過該設計模式實現在一定範圍內只存在一個該類的實例對象。
實現原理:通過私有構造方法達到無法外界創建新對象,聲明靜態私有的對象以及公有靜態的getInstance()方法使外界可獲得該對象。
相關注意:存在多線程問題。
package _1_單例模式;
public class Singleton {
//1、聲明靜態私有對象
private static Singleton singleton = null;
//2、將構造函數改變成私有的
public Singleton() {
}
//3、生成一個靜態的公有方法
/**
* 存在多線程問題
* @return
*/
public static Singleton getInstance(){
if (singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
基於多線程優化
1、同步鎖法
package _1_單例模式;
public class Singleton_1 {
private static Singleton_1 singleton_1 = null;
public Singleton_1() {
}
/**
* 第一種方式:
* 同步鎖:可行,但是比較耗資源
* @return
*/
public static synchronized Singleton_1 getInstance(){
if (singleton_1 == null){
singleton_1 = new Singleton_1();
}
return singleton_1;
}
}
2、先行對象法
package _1_單例模式;
public class Singleton_2 {
private static Singleton_2 singleton_2 = new Singleton_2() ;
public Singleton_2() {
}
/**
* 第二種方式:
* 先行對象:可行,對象不管使不使用都存在,比較耗資源
* @return
*/
public static Singleton_2 getInstance(){
if (singleton_2 == null){
singleton_2 = new Singleton_2();
}
return singleton_2;
}
}
3、雙重檢查加鎖法
package _1_單例模式;
public class Singleton_3 {
//添加volatile關鍵字,使該對象線程間可用
private volatile static Singleton_3 singleton_3 = null;
public Singleton_3() {
}
/**
* 第三種方式:
* 雙重檢查加鎖:可行,但是比較耗資源
* @return
*/
public static Singleton_3 getInstance(){
if (singleton_3 == null){
//添加同步鎖:類上面
synchronized (Singleton_3.class){
if (singleton_3 == null){
singleton_3 = new Singleton_3();
}
}
}
return singleton_3;
}
}