關於物件池的一些分析

2021-07-25 18:49:04 字數 1813 閱讀 1641

在日常的開發工作中,我們可能使用或者聽說過物件池,執行緒池以及連線池。本文將介紹物件池的產生緣由,具體實現細節,以及需要注意的問題。

android中使用物件池的應用有很多,比如下面的這些都是應用了該模式

以乙個簡單的獲取sytledattributions**為例,展示一下物件池的應用

123

4567

891011

final

typedarrayta=

context

.obtainstyledattributes(,

android

.support.v7

..r.

styleable.);

tryfinally

想必這段**都可能寫過,那就是在一開始的時候,我們都會被告誡:使用typedarray結束的時候,一定要呼叫它的recycle方法。

回想起來,當時自己還很疑惑為什麼要這麼規定,其實很簡單,它使用了物件池。

呼叫者通過obtain方法從物件池中獲取物件,然後使用完畢後,需要使用recycle方法返還給物件池。

上面的介紹中,也或多或少提到了下面的三種角色

在多執行緒的環境下,我們也會使用物件池。因此做好必要的同步是必須的。

要進行同步處理的通常是這兩個方法

下面是一段進行同步處理了的物件池的原始碼。

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

public

static

class

synchronizedpool

<

t>

extends

******pool

<

t>

@override

public

tacquire()}

@override

public

boolean

release(t

element)}

}

上述**為android中android.support.v4.util提供的pools中的synchronizedpool的實現,它使用了synchronized關鍵字實現同步問題。

為了統一管理物件,建議將物件池設為單例。

應用單例模式的時候,需要確保在多執行緒併發的情況下保持唯一的例項建立,具體實現方案,可以參考單例這種設計模式

所謂的髒物件就是指的是當物件被放回物件池後,還保留著剛剛被客戶端呼叫時生成的資料。

髒物件可能帶來兩個問題

處於物件池中的物件生命週期要比普通的物件要長久。維持大量的物件也是比較占用記憶體空間的。

以threadpoolexecutor為例,它提供了allowcorethreadtimeoutsetkeepalivetime兩種方法,可以在超時後銷毀核心執行緒。我們在具體的實踐中可以參考這個策略。

相對來說,使用物件池client呼叫也會複雜一些,比如請求物件時有可能出現的阻塞,異常或者null值。這些都需要我們做一些額外的處理,來確保程式的正常執行。

除此之外,還有上面的提到的兩個問題,他們分別是

所以當我們想要使用物件池時,需要謹慎的衡量並準確的實現,享受它帶來的好處,並避免其帶來的問題。

關於物件導向的一些思考

物件導向方法被人談論了二十多年了。我接觸它比較晚,直到九十年代中期才開始學習使用它。若說對這個方法做些評價,那還真是大言不慚了。不過這麼些年來,也週期性的對物件導向做些思考。或對或錯,我想都值得總結一下。一家之言,來看的同學不必太當真。首先我們要區分一下 基於物件 和 物件導向 的區別。基於物件,通...

一些關於物件導向的思考

python是一門神奇的語言,看了看裡面一些關於物件導向的描述。覺得挺受啟發的,在c 中同樣適用。主要觀點出自magnus lie hetland的 python基礎教程 1 將屬於一類的物件放在一起。如果乙個函式操縱乙個全域性變數,那麼兩者最好都在類內作為特性和方法出現。2 不要讓物件過於親密。方...

關於物件導向的一些想法

這兩天在寫程式,一直在想模組之間的資訊交流到底用什麼方式,gui中接收到的資料如何才能和邏輯層中的業務進行交流,一開始我使用的是字串,感覺這種方式很不好,於是開始考慮使用物件來傳遞訊息。使用字串是一開始程式設計的時候很容易想到的,很直觀簡單,可是使用的時候就不是這個樣子了,使用字串的話,模組之間的耦...