學(xué)習(xí)了Java兩個(gè)月。。之后兩個(gè)月學(xué)習(xí)jsp,servlet,sql,html一堆雜七雜八的東西。又花一個(gè)多月復(fù)習(xí)了一下。。。 之后一個(gè)偶然的機(jī)會(huì),跑J道里逛了逛。。banq老大強(qiáng)調(diào)oo思想,設(shè)計(jì)模式。。于是開(kāi)始學(xué)習(xí)設(shè)計(jì)模式 :D 剛開(kāi)始學(xué)。。好多東西都不是那么明白。。。有理解錯(cuò)誤的地方還請(qǐng)多多指教。。。 我從Singleton開(kāi)始學(xué)。。我是這么理解的。。 Singleton顧名思義就是只能創(chuàng)建一個(gè)實(shí)例對(duì)象。。所以不能擁有public的構(gòu)造方法。。 java 代碼
既然構(gòu)造方法是私有的,那么從外面不可能創(chuàng)建Singleton實(shí)例了。。只能從內(nèi)部創(chuàng)建。。所以需要一個(gè)方法來(lái)創(chuàng)建此實(shí)例。。此方法肯定必須是static的。。
java 代碼
getInstance方法要返回一個(gè)Singleton實(shí)例。。就要一個(gè)Singleton類型的變量來(lái)存儲(chǔ)。。聲明一個(gè)Singleton類型的屬性。。同樣需要是static 的。。靜態(tài)方法只能訪問(wèn)靜態(tài)屬性。。。 java 代碼
如此就能獲得Singleton的實(shí)例了。。但是并不能確保只生成一個(gè)實(shí)例。。。需做判斷。。。 java 代碼
這樣就可以了。。。 接著就牽扯到了線程問(wèn)題。。。假設(shè)有兩個(gè)線程。。thread1,thread2。。thread1運(yùn)行到第5行,然后跳到了thread2。。也運(yùn)行到第5行之后。。。此時(shí)兩線程都得到single為空。。。那么就會(huì)有兩個(gè)實(shí)例了。。。解決辦法。。同步。。 java 代碼
還有一種方法,提前實(shí)例化。。。 java 代碼
此時(shí)single的static修飾符有起到另一個(gè)作用。。。因?yàn)閟tatic類型的屬性,只在類加載時(shí)初始化一次。。。以后不會(huì)再初始化了。。確保了只有一個(gè)實(shí)例。。。 最后一種方法是再head first design pattern上看到的。。double-checked locking。。。 java 代碼
目前對(duì)Singleton的理解就這么多。 |
|
來(lái)自: wantin6 > 《我的圖書(shū)館》