單例對象的創建與銷毀


類、對象、實例的區別

  在面向對象的概念當中,類(class)是既包括數據又包括作用於數據的一組操作的封裝體。
  對象(Object)是類的實例(instance)。對象是動態的,擁有生命周期,都會經歷一個從創建、運行到消亡的過程。對象與類的關系就像變量與數據類型一樣。

  當使用new創建了一個對象的時候,系統會在內存為其分配地址,為對象中的成員變量進行了初始化等等,所以說每次new的都是新對象,每個新new的對象都是不相同的.

    MyClass myClass=new MyClass();
  new的時候在堆中新建了一個對象。這個對象是MyClass的實例。其中myClass是該對象的引用。對象實例化,也可以叫做初始化。

 

單例模式中的對象和實例

  在單例模式中,每個bean定義只生成一個對象實例。
  單例模式的構造函數是私有的,沒有辦法直接使用new調用構造函數,所以不會創建新對象。它只能通過它的一個靜態方法得到實例,而這個靜態方法可以去調構造函數產生一個實例並返回。

  單例模式的作用 :可以保證在程序運行過程,一個類只有一個實例,而且該實例易於供外界訪問,從而方便地控制了實例個數,並節約系統資源。

  單例模式的使用場合:在整個應用程序中,共享一份資源(這份資源只需要創建初始化1次),應該讓這個類創建出來的對象永遠只有一個。

 

單例模式中對象的創建與銷毀

  想到一個問題,單例模式的對象是在什么時候創建和銷毀的?

  如果說單例模式的對象,在服務啟動的時候創建,在服務停止的時候銷毀,那么在中間這很長時間里都是在運行。細想想也有不和邏輯的的地方。如果沒有人訪問服務器,那么單例模式的對象就會長時間的不被使用,不被使用的對象就會被垃圾回收器(GC)回收吧。如果對象被回收了,下一次又新建了一個對象,又怎么保證是同一個對象呢。

  后來看到一個說法:

問:
  啟動服務器的時候是怎樣加載這個單例類的?

答:
  Java 源程序(.java 文件)在經過 Java 編譯器編譯之后就被轉換成 Java 字節代碼(.class 文件)。類加載器負責讀取 Java 字節代碼,並轉換成 java.lang.Class 類的一個實例。每個這樣的實例用來表示一個 Java 類。通過此實例的 newInstance()方法就可以創建出該類的一個對象。

  其實所謂的單例模式並不是他的對象永遠就只有一個,一個類的對象在我們需要的時候可以隨時創建,但是我們不需要管實例的銷毀,因為垃圾管理器會自動銷毀,這也是java語言的一個特點之一;但是單例模式就是在該類在已經創建一個對象的情況下不允許在創建另一個對象,所以你在使用線程的時候要注意單例類的鎖定,不允許2個線程中同時調用一個單例類,應為這2個線程的實例會被創建2次也就是2個不同的實例,這違反了單例模式的約束;
  所以你的問題:在啟動服務器的時候該類的實例並沒有產生;但是該類會在 java.lang.Class中有一份他自己的字節碼。

 

  如果上面的回答是正確的,那可以理解為:
  單例模式並不是它的對象永遠就只有一個。而是在該類已經創建一個對象的情況下,不允許再創建另一個對象。所以單例模式的對象並不是在服務啟動時創建,在服務停止時銷毀。它也是在用到的時候創建,不用的時候銷毀。具體就是:服務啟動的時候,創建的是類的字節碼,在用到時候類加載器讀取字節碼,生成一個實例,這樣就創建出了一個對象。當長時間不使用對象的時候,對象就會被垃圾器回收。下次創建的時候,依然是讀取字節碼。

  個人覺得是這個邏輯。如果有不對的地方,還請大神指正。

 

  原創文章,歡迎轉載,轉載請注明出處!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM