如何寫出面試官欣賞的Java單例

來源:互聯網
上載者:User

標籤:包含   自身   pst   http   單例   構造   代碼   軟體   sync   

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個執行個體。

今天我們不談單例模式的用途,只說一說如果在面試的時候面試官讓你敲一段代碼實現單例模式的情況下怎樣寫出讓面試官眼前一亮的單例代碼。因為筆者學的是Java,所以接下來的執行個體將用Java語言編寫。

說到單例模式,第一個想到的是該類中有一個初始化為null的自身引用,且被private修飾符修飾,其它類不得直接存取。除此之外,單例模式的類還需要有private的構造方法,這一點不難理解,如果構造方法是public的,那麼類外部可以直接調用該類的構造方法,如此一來便不具備單例的特性。那麼怎麼擷取該類唯一的執行個體呢?這就需要一個公有的擷取器,該方法傳回值類型是單例模式類,返回的結果自然是該類中唯一的執行個體。思路有了,我們便可以實現最簡單的單例模式類:

不得不說,這樣的做法確實達到了單例模式的要求,正常情況下系統中只有一個Singleton的對象。但是如果存在並發的情況呢?兩個使用者同時訪問該類的擷取器,此時假設Singleton對象還未被執行個體化,那麼系統將會兩次調用構造方法,這樣一來系統中就會存在兩個Singleton類的執行個體。說明這種方式的單例沒有考慮到並發情況,說明面試者只是粗略的瞭解單例模式,並沒有加以深入思考,想讓面試官滿意?呵呵。。。。。。

Java相較於C++而言個人認為編程的難易度上來說要容易很多。在考慮線程同步時一個synchronized關鍵字便能解決普通加鎖問題。synchronized關鍵字,當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多隻有一個線程執行該段代碼。也就是說當兩個線程同時訪問類中synchronized方法或代碼塊時,只能有一個線程執行其代碼,另一個只能等待當前線程調用結束後才能訪問。這下子單例的實現就so easy了!只要對代碼稍加改動即可:

這樣的寫法面試官會覺得你這個面試者在思考問題的時候比較全面,考慮到並發的情況,相較之前的方式面試官會覺得:少年,很有前途哦!

然而光是讓面試官看好是不夠的,我們要讓他欣賞,通過單例這樣的小問題便能拿到offer。也就是說第二種實現方式是可以進行最佳化的。如何最佳化呢?我們看到,當前系統中每次調用擷取方法時便會進行加鎖,而加鎖需要的時間便是我們可以進行最佳化的地方。現在我所想的是我們只需要在第一次調用時加一次鎖往後便再也不不需要加鎖了,這樣一來便省下了每次調用加鎖的時間,雖然電腦執行加鎖的時間很短但久而久之也是相當長的一段時間。

那麼怎麼實現呢?這需要引入另一個關鍵字volatile。volatile修飾的話就可以確保instance = new Singleton();對應的指令不會重排序(JVM當發現代碼執行順序變化但結果不變時可能會改變執行順序來提升自身效能。好坑。。。),也是安全執行緒的。

如何理解呢?

  1. 線程 1 進入get 方法。

  2. 由於single 為null,線程 1 在 //1 處進入 synchronized塊。

  3. 線程 1 被線程 2 預占。

  4. 線程 2 進入get 方法。

  5. 由於single 仍舊為null,線程 2 試圖擷取 //1 處的鎖。然而,由於線程 1 持有該鎖,線程 2 在 //1 處阻塞。

  6. 線程 2 被線程 1 預占。

  7. 線程 1 執行,由於在 //2 處執行個體仍舊為null,線程 1 還建立一個Singleton對象並將其引用賦值給single。

  8. 線程 1 退出 synchronized塊並從 get方法返回執行個體。

  9. 線程 1 被線程 2 預占。

  10. 線程 2 擷取 //1 處的鎖並檢查single 是否為null。

  11. 由於single 是非 null的,並沒有建立第二個Singleton對象,由線程 1 建立的對象被返回。

像這樣的程式,面試官看完還能不給你offer嗎?騷年,前途不可限量啊!

如何寫出面試官欣賞的Java單例

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.