1. 程式人生 > >對象初始化過程與單例設計模式(餓漢式與懶漢式)

對象初始化過程與單例設計模式(餓漢式與懶漢式)

得到 延時 兩個 都是 person 其他 導致 最大 類屬性

1.對象初始化過程:(先加載類到內存,然後加載類屬性,成員方法)

   定義一個類Person, 在new Person("zhangsan",20); 初始化過程:

  1. 因為new 用到Person.class文件,所以會先找到Person.class文件並加載到內存中.
  2. 執行該類中的static靜態代碼塊,如果有的話,給Person.class類進行初始化.
  3. 在對內存中開辟空間,分配內存地址.

   4.在對內存中建立對象的特有屬性,並進行默認初始化.

   5.對屬性進行顯示初始化.

   6.對對象進行對應的構造代碼塊初始化.

  7.對對象中構造函數進行初始化.,

  8.將內存地址付給棧內存中的p變量.

註意: 靜態只能在棧內存裏,非靜態變量在堆裏.

2.單例設計模式:解決一個類在內存中只存在一個對象(保證對象唯一).

  1.禁止其他程序建立該類對象.

  2.在本類自定義一個對象.

  3.為了提供其他程序使用該類對象,對外提供一些訪問方法.

  解決問題:

    1.將構造函數私有化.(私有化無參構造函數,這樣外界就不能直接訪問該類對象.)

    2.在類中創建一個本類對象.(靜態類)

    3.提供一個方法可以獲取到該對象(靜態方法).

懶漢模式

關鍵點:

1)構造函數定義為私有----不能在別的類中來獲取該類的對象,只能在類自身中得到自己的對象

2)成員變量為static的,沒有初始化

----類加載快,但訪問類的唯一實例慢,static保證在自身類中獲取自身對象

3)公開訪問點getInstancepublicsynchronized-----public保證對外公開,同步保證多線程時的正確性(因為類變量不是在加載時初始化的)

餓漢模式

關鍵點:

1)私有構造函數

2)靜態私有成員--在類加載時已初始化

3)公開訪問點getInstance-----不需要同步,因為在類加載時已經初始化完畢,也不需要判斷null,直接返回

懶漢式的優點是延時加載、缺點是應該用同步、其實也可以不用同步、看你的需求了,多創建一兩個無引用的廢對象其實也沒什麽大不了。

單例中懶漢和餓漢的本質區別在於以下幾點:


  1、餓漢式是線程安全,在類創建的同時就已經創建好一個靜態的對象供系統使用,以後不在改變。懶漢式如果在創建實例對象時不加上synchronized則會導致對對象的訪問不是線程安全的。
  2、從實現方式來講他們最大的區別就是懶漢式是延時加載,他是在需要的時候才創建對象,而餓漢式在虛擬機啟動的時候就會創建,餓漢式無需關註多線程問題、寫法簡單明了、能用則用。但是它是加載類時創建實例、所以如果是一個工廠模式、緩存了很多實例、那麽就得考慮效率問題,因為這個類一加載則把所有實例不管用不用一塊創建。

工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。這兩個模式區別在於需要創建對象的復雜程度上。

線程安全就是多線程訪問時,采用了加鎖機制,當一個線程訪問該類的某個數據時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程才可使用。不會出現數據不一致或者數據汙染。 線程不安全就是不提供數據訪問保護,有可能出現多個線程先後更改數據造成所得到的數據是臟數據。線程安全問題都是由全局變量靜態變量引起的。

單利模式呢 就是永遠保持一個對象,懶漢模式在運行的時候 獲取對象比較慢,但是加載類的時候比較快,但是餓漢模式是在運行的時候獲取對象較快,加載類的時候慢。

單例模式有以下特點:
  1、單例類只能有一個實例。
  2、單例類必須自己創建自己的唯一實例。
  3、單例類必須給所有其他對象提供這一實例

對象初始化過程與單例設計模式(餓漢式與懶漢式)