黑馬程序員------java中可能出現的面試題(重點)

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

一.單例設計模式

* 單例設計模式的體現
 * 需求:爲了保證一個類在內存中只能夠存在一個對象
 * 方法步驟:
 * 1、首先對此類構造函數進行私有化
 * 2、構造函數私有化以後,外界就不能夠創建對象了,那麼只能在本類中自定義對象
 * 3、想要外界訪問到本類自定義對象的話,那麼就需要提供訪問方法
 * 4、外界想要訪問本類,因爲不能夠創建對象,所以必須通過類名.方法名的方式訪問,那麼本類中的方法就必須定義爲static
 * 5、因爲本類中方法定義成了靜態,而靜態成員不能夠訪問非靜態成員,所以對象也必須靜態修飾
 * 6、然後當調用了方法時,可以通過返回該類對象的方式獲取到對象
 * 7、然後定義一個變量進行接收
 * 8、此時該變量的內存地址值就是s對象的內存地址值,指向堆內存中的new Single();

代碼示例:

//餓漢式
public class Dan_li_she_ji {
	public static void main(String[] args) {
		
		Single s1 = Single.getInstance();
		s1.setName("張三");
		System.out.println(s1.getName());
		
		Single s2 = Single.getInstance();  //這並沒有創建對象,而是定義了一個新的變量,所指向的仍然是s對象
		s2.setName("李四");   //s2更改了name的值,那麼s1、s2訪問到得name值都是“李四”
		System.out.println(s1.getName());  //現在s1、s2內存地址值一樣,所指向的對象都爲s
		System.out.println(s2.getName());
	}
}

class Single{
	private String name;
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	
	private Single(){}
	private static final Single s = new Single();
	
	public static Single getInstance(){
		return s;
	}
}

//懶漢式
class Single3{
	private Single3(){}
	private static Single3 s = null;
	
	public static Single3 getInstance(){
		if(s==null){
			s = new Single3();
		}
		return s;
	}
}


* 餓漢式與懶漢式比較
 * 區別:
 * 1、餓漢式是在類加載到內存時對象就已經創建了;餓漢式只有當調用了getInstance方法時才創建對象
 * 2、懶漢式的特點是對象的延遲加載
 * 
 * 
 * 重點:當懶漢式遭遇多線程運行時會出現問題
 * 問題:當一個線程執行了if語句後,在這兒停下了,這時候另一個線程執行了if語句,
 * 第一個線程這時候又開始運行,創建了一個對象,第二個線程繼續運行,又創建了一個對象
 * 這時候就不符合程序對象的唯一性了
 * 解決辦法:
 * 1、把getInstance方法用synchronized修飾,這樣雖然可以避免創建多個對象,可是存在弊端
 * 每一個線程進來的時候都需要先判斷鎖是不是開着來,這樣很耗費資源
 * 
 * 最佳解決辦法:
 * 1、把線程所執行的共享數據if語句synchronized,因爲getInstance語句是靜態的,所以這時候的鎖是Single1.class字節碼文件
 *    這樣仍然存在弊端,因爲每一個線程進來仍然需要判斷鎖的狀態,這時候在synchronized語句上加上if(s==null),
 *    這樣的話當第一個線程執行到一半停止了,那麼第二個線程進不去,當第一個線程執行完畢,第二個線程仍然進不去,後面所有的
 *   線程都不需要讀取鎖的狀態,這樣節省資源

代碼示例:

public class Dan_li_she_ji_bijiao {

}

//餓漢式
class Single1{
	private Single1(){}
	private static final Single1 s = new Single1();
	
	public static Single1 getInstance(){
		return s;
	}
}

//懶漢式(延遲加載的單例設計模式)
class Single2{
	private Single2(){}
	private static Single2 s = null;
	
	public static Single2 getInstance(){
		if(s==null){
			synchronized(Single2.class){
				if(s==null){
					s = new Single2();
				}
			}
		}
		return s;
	}
}

 

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------詳細請查看:http://edu.csdn.net


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章