準備面試過程中遇到比較有意思的一個題

對於單例類,大家應該不陌生吧,但是要用好,還是要信息一些,否則出現內存泄漏都弄不明白爲什麼。

題目是這樣的:手寫單例模式
剛入IT行業的人多半會以爲人家考察的是你對設計模式的理解,其實別人還有另一層深意。
如果只是這樣寫:

class Singleton
{
public:
	static Singleton* getInstance()
	{
		if(instance == NULL)
		{
			instance = new Singleton();
		}
	
		return instance;
	}

private:
	static Singleton* instance;
	Singleton(){}
}

會有什麼問題?思考一下

如果你的程序只有一個線程用到它,這樣寫完全沒問題,甚至還是比較好的設計;但如果在多線程情況下呢?
現在有2個線程同時訪問這段代碼,很不幸,他們都進入了爲空的判斷的代碼段裏,接下來,他們各自new一個對象出來並執行賦值,最後,有一塊堆內存在你不經意間遨遊神州大地去了,不歸你管了。
如何解決呢?

class Singleton
{
public:
	static Singleton* getInstance()
	{
		if(instance == NULL)
		{
			pthread_mutex_lock(mtk);
			if(instance == NULL)
			{
			instance = new Singleton();
			}
			pthread_mutex_unlock(mtk);
		}
	
		return instance;
	}

private:
	static pthread_mutex_t mtk;
	static Singleton* instance;
	Singleton(){}
}

現在,即使你都進去了爲空的代碼段裏面,也不會出現多個線程都各自new對象的情況。

這裏考察的有三個點:
1)對static理解是否通透
2)單例設計模式
3)線程安全設計

可能有人會問,不會吧,你連這個都不知道;非也,我當時採用的是另一種做法,不過沒有這個方案好就是了。我們當時在程序進行初始化的時候就已經將每一個單例類的getInstance執行了一遍(當然也有安全檢測),所以後邊根本不會進入到那段代碼段裏,當然這裏會帶來一個問題,程序啓動慢,而且部分單例類如果你一直用不到的話,就會浪費內存空間(多出現在維護和優化代碼過程中對代碼的精簡,工作中不用的代碼一般是不會刪除的,要麼不用,要麼註釋掉,STL就如是做的)

最後說下51期間,我在花城廣場見到的一個新玩意:無人售賣車,以前是售賣機對不對,不能動的;現在出車了,都不需要你自己走過去了,它自己走過來。唉,想想不久的未來,是不是連田都是機器種的,沒工作的只能找個地躺屍了(T_T)

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