/**
* 單例模式的使用
*
* 單例創建用戶服務對象 沒必要給每個用戶都創建一個
*
* 單例 :1 構造方法私有化 2 創建一個私有的靜態變量?。场」驳撵o態方法 當做入口
*
* @param user
*/
/*
* 第一種單例模式
*/
// 問題 : 預先加載,沒有手動實例化變量的時候 已經實例化了變量
// 當你要使用對象的時候,只是把這個變量給你
// 1 構造方法私有化 外界不能直接訪問
PRivate UserService(){}
// 2 創建一個私有的靜態變量(常量)
private static final UserService USER_SERVICE = new UserService(); // 3對外提供一個 公共的 靜態的 返回該對象實例的一個方法
public static UserService getInstance(){
return USER_SERVICE; }
/**
* 第二種 問題: 排隊嚴重 嚴重影響效率 因為每個用戶在計算機里面都是一個單獨的線程
* 當 一個線程 調用UserService 對象以后 加了一把鎖
* 別人就訪問不了了
*
*
* 單例模式的目標是什么?
* 是為了讓當前類只能產生一個對象 如果 我先后創建了多個還是單例嗎?.
* @param user
*/
private UserService(){};//構造方法私有化
private static UserService userService = null; //先創建一個 靜態變量
public static synchronized UserService getInstance(){
if(userService == null){ //如果為空 我返回一個新的
userService = new UserService();
}
return userService; //如果不為空 直接返回
}
// -------------第三種---------------------
/**
* 如果兩個線程同時判斷了userService是空 進去了 第一個線程創建的疏忽,鎖住了,第二個需要瞪大,第一個線程創建完了之后
* 本來是第二個,我不需要再創建了 ,但是他已經在判斷里面了,所以又創建了一個 ,所以說,單例模式沒有成功
*
* @param user
*/
private UserService(){}//構造方法私有化
private static UserService userService = null;
public static UserService getInstance() {
if(userService == null){//如果兩個或多個線程同時進入這里,判斷完成后都為空,那么會創建好多對象吧,單例模式就失效了
synchronized(UserService.class){//我現在對整個類鎖了 userService = new
UserService();
}
} return userService;
}
// -----------------第四種----------------
private UserService() {
}// 構造方法私有化
private static UserService userService = null;// 私有的靜態變量
public static UserService getInstance() {// 獲取當前類對象的方法
if (userService == null) {
synchronized (UserService.class) {// 現在是對整個類鎖住了
if (userService == null) {// 更上面第三章方法一樣,當前就能解決第三種方法的問題(創建了多個對象),因為,就是兩個同事進入上面的if判斷,到這里,就會判斷不通過,就會直接返回一個對象,不會在去創建新的對象
userService = new UserService();
}
}
}
return userService;
}
新聞熱點
疑難解答