/**
* 類載入時就建立例項
*/public
class
singleton
private
final
static singleton singleton=
newsingleton()
;public
static singleton getinstance()
}/**
* 靜態**塊實現(類載入時)
*/public
class
singleton
private
static singleton singleton;
static
public
static singleton getinstance()
}
public
class
singleton
private
static singleton singleton;
public
static singleton getinstance()
return singleton;
}}
/**
* 方法加鎖
*/public
class
singleton
private
static singleton singleton;
public
static
synchronized singleton getinstance()
return singleton;}}
/** * **塊加鎖
*/public
class
singleton
private
static singleton singleton;
public
static singleton getinstance()
}return singleton;
}}
建立例項** singleton = new singleton(); 主要做了三件事
1.開闢空間
2.建立物件
3.位址指向
不加volatile:可能執行順序為132 這時第二個獲取資源會是位址不為空但是物件例項為空
加上volatile:防止jvm指令重排 確保執行順序為123 確保要麼靜態變數為null 要麼有位址指向並且物件例項也不為空
public
class
singleton
private
static
volatile singleton singleton;
public
static singleton getinstance()
}}return singleton;
}}
靜態內部類是怎麼保證執行緒安全的呢?
虛擬機會保證乙個類的()方法在多執行緒環境中被正確地加鎖、同步,如果多個執行緒同時去初始化乙個類,
那麼只會有乙個執行緒去執行這個類的()方法,其他執行緒都需要阻塞等待,直到活動執行緒執行()方法完畢。
如果在乙個類的()方法中有耗時很長的操作,就可能造成多個程序阻塞 ( 需要注意的是,其他執行緒雖然會被阻塞,
但如果執行()方法後,其他執行緒喚醒之後不會再次進入()方法。同乙個載入器下,乙個型別只會初始化一次。)
在實際應用中,這種阻塞往往是很隱蔽的
public
class
singleton
private
static
class
singletoninner
public
static singleton getinstance()
}
列舉實現單例可能不太好理解
其實在編譯成class檔案時,會預設為列舉類成員加上 final static修飾
再想想就和靜態內部類的實現幾乎一樣了
在實際**中可以將需要執行一次的可寫在私有方法中
public
enum singleton
// 列舉中私有方法只會執行一次
private
void
methodb()
}
設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...
設計模式之單例模式
package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...
設計模式之 單例模式
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...