單例模式(一)static final和單例模式

2022-05-07 05:09:09 字數 2124 閱讀 7572

那天我朋友問了我個問題,static和單例模式有什麼區別,所以我覺得static可以講一下

他的問題是,把物件弄成static是不是就不變了

顯然,這是還沒弄清楚引用和物件的區別

其實存放在靜態區中的是引用,而不是物件。而物件是存放在堆中的。如果有這樣一句話

public

static final book book = new book();

意思就是book這個引用,指向了這個new出來的物件。

當你載入了這個類的時候(第一次使用這個類的時候會載入這個類到jvm),這個static引用會率先被載入。所以,當我們第一次呼叫book.book的時候,這個靜態的book引用就會一直存放在靜態區里了(當fullgc**整個類才會銷毀這個引用)。

而正常的引用,只能通過new出乙個物件後才能使用,所以當物件被**了,這個引用自然也**了(而且非靜態引用如果是方法中的引用,會存放在函式的棧裡;如果是物件的引用,會和物件一起存放在heap裡)。

final定義了之後,你就必須在一開始就需要賦值,所以上面那行**就必須在一開始就賦值。而如果你想延遲載入,提高效能,那麼就不可以用final。

單例模式是如果實現的,就是通過呼叫這個類裡的乙個靜態方法,弄乙個if語句判斷一下,如果有例項了,就返回這個例項,如果沒有,就建立這個例項。其實並沒有多大的技術含量。

第一種,最基本的思維。

public

class

book

public

static

book getinstance()

return

book;

}}

這裡為什麼要判空呢?因為你這個是靜態的,所以其他地方完全有book.getinstance = null;的可能。

第二種,這裡使用final,讓引用的指向不可變,這樣就不需要判空了

public

class

book

public

static

book getinstance()

}

第三種,延遲載入(執行緒不安全,假如有多個同時發現是空的,會建立出好多例項)

public

class

book

public

static

book getinstance()

return

book;

}}

第四種,新增執行緒安全功能,加乙個關鍵字就可以

public

class

book

public

static

synchronized book getinstance()

return

book;

}}

這個方法在多執行緒下的工作表現很出色

第五種,規避不需要的同步,因為上面的同步範圍太大,有點浪費效能,在引用有指向的時候,是不需要同步的

public

class

book

public

static

synchronized book getinstance()

}return

book;

}}

第六種,靜態內部類

public

class

book

public

static

synchronized book getinstance()

private

static

class

bookholder

}

第七種,列舉單例

public

class

book

public

static

book getinstance()

private

static

enum

bookenum

public

book getinstance()

}}

最優,但是列舉這個東西可讀性不高

一 單例模式

單例模式是最簡單的模式,只是在併發的時候單例模式的懶漢模式會有執行緒不安全的情況 單執行緒 單例模式 懶漢模式 執行緒不安全 package com.wb.single public class single public static single getinstance return singl...

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...