.Net Core中ObjectPool的使用與源碼解析
一、對象池
運用對象池化技術(shù)可以顯著地提升性能,尤其是當對象的初始化過程代價較大或者頻率較高。下面是ObjectPool源碼中涉及的幾個類。當你看過.Net Core源碼很多時,你會發(fā)現(xiàn),微軟的開發(fā)很多都是這種模式,通過Policy構(gòu)建Provider,通過Provider創(chuàng)建最終的類。

二、使用
這個組件的目的主要是將對象保存到對象池,用的時候直接去取,不需要重新創(chuàng)建,實現(xiàn)對象的重復(fù)利用。但是有個問題,假如對象池中開始沒有對象或者取得數(shù)量大于對象池中的數(shù)量怎么辦?在對象池中對象的數(shù)量不足時,此時來取對象,需要通過Policy創(chuàng)建對象,至于怎么創(chuàng)建對象,是你需要實現(xiàn)的。Policy如上圖,有個默認實現(xiàn) DefaultPooledObjectPolicy ,它的創(chuàng)建就是 new T().
DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new DefaultPooledObjectPolicy<User>(), 2);
var firstUser=defaultPool.Get();//從對象池中取一個對象,此時對象池中還沒有對象,返回 Age=0 Name=null
var user1 = new User()
{
Age = 18,
Name = "MicroHeart"
};
var user2 = new User()
{
Age = 19,
Name = "MicroHeart"
};
var user3 = new User()
{
Age = 20,
Name = "MicroHeart"
};
defaultPool.Return(user1);//將對象放回對象池中,但是不一定成功。對象池有數(shù)量限制,而且也可以自定義限制,讓一些對象不能放入對象池中
defaultPool.Return(user2);
defaultPool.Return(user3);
var u1 = defaultPool.Get();//從對象池中取一個對象,返回第一個放入的user1
var u2 = defaultPool.Get();//從對象池中取一個對象,返回第二個放入的user2
var u3 = defaultPool.Get();//此時對象池中沒有對象了,獲取對象調(diào)用的Policy的Create方法,而DefaultPooledObjectPolicy的Create方法的實現(xiàn)是:new T(),所以返回 Age=0 Name=null
上面例子當對象池中沒有對象是,調(diào)取獲取方法,其實就是new T()。下面在對象中添加3個對象,但是對象池中只有2個空間,所以第三個是添加不進去的。
現(xiàn)在自己創(chuàng)建一個的Policy
public class MyUserPolicy : PooledObjectPolicy<User>//需要繼承抽象類
{
public override User Create()
{
return new User()
{
Age = 18,
Name = "MicroHeart"
};
}
public override bool Return(User user)
{
if (user.Age == 18)
return false;
return true;
}
}
DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new MyUserPolicy(), 2);
var firstUser=defaultPool.Get();//返回 Age=0 Name=null
var user1 = new User()
{
Age = 18,
Name = "MicroHeart"
};
var user2 = new User()
{
Age = 19,
Name = "MicroHeart"
};
var user3 = new User()
{
Age = 20,
Name = "MicroHeart"
};
defaultPool.Return(user1);
defaultPool.Return(user2);
defaultPool.Return(user3);
var u1 = defaultPool.Get();//返回user2 因為user1的Age=18,policy中Reture篩選條件 返回false,導(dǎo)致第一個user不能放入連接池中。
var u2 = defaultPool.Get();//返回user3
var u3 = defaultPool.Get();//返回 Age=18 Name=MicroHeart 這個是使用 Policy中的Create創(chuàng)建
三、源碼解析
IPooledObjectPolicy<T>: 主要作用是創(chuàng)建對象和將對象放入連接池中
Create:定義一個創(chuàng)建對象的方法,當連接池中的數(shù)量不夠取的時候,通過此方法創(chuàng)建對象。
Return:將對象放入連接池中,如果放入成功,返回Ture.否則返回False.
DefaultPooledObjectPolicy<T>:繼承抽象類PooledObjectPolicy<T>,而抽抽象類繼承接口 IPooledObjectPolicy<T>。Policy的默認實現(xiàn)類
Create:定義一個默認創(chuàng)建對象的方法 new T();
Return:不論是否放入連接池,全部返回True.
ObjectPoolProvider:創(chuàng)建對象池(ObjectPool)
abstract ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy):通過Policy創(chuàng)建ObjectPool
DefaultObjectPoolProvider:ObjectPoolProvider的默認實現(xiàn)類
ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy) :創(chuàng)建一個可以容納處理器數(shù)量X2的對象池。
ObjectPool<T>:對象池
T Get():從對象池中獲取對象。
void Return(T obj):將對象放入對象池中。
DefaultObjectPool:對象池的默認實現(xiàn)類,它實現(xiàn)了Get和Return方法。其實對象池的本質(zhì)就是它的中的 ObjectWrapper[] _items; ,當使用Return方法是,將對象放入 ObjectWrapper數(shù)組中。Get方法從數(shù)組中取。

總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
詳解ASP.NET MVC下的異步Action的定義和執(zhí)行原理
這篇文章主要介紹了詳解ASP.NET MVC下的異步Action的定義和執(zhí)行原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
ASP.NET MVC5+EF6+EasyUI 后臺管理系統(tǒng)(81)-數(shù)據(jù)篩選(萬能查詢)實例
本篇文章主要介紹了ASP.NET MVC5+EF6+EasyUI 后臺管理系統(tǒng)(81)-數(shù)據(jù)篩選(萬能查詢) ,具有一定的參考價值,有興趣的可以了解一下。2016-12-12
.NET Core應(yīng)用類型(Portable apps & Self-contained apps)
這篇文章主要介紹了.NET Core應(yīng)用類型,通常類型用來描述一個特定的執(zhí)行模型或者基于此的應(yīng)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
DataGrid使用心得(調(diào)用及連接數(shù)據(jù)庫等等)
在工作中遇到把DataGrid中綁定的后臺數(shù)據(jù)庫數(shù)據(jù)展示給用戶時把負數(shù)變?yōu)?的小問題,現(xiàn)在把它記錄下來包括DataGrid的調(diào)用/連接數(shù)據(jù)庫進行操作等等,感興趣的朋友可以了解下,或許本新得對你有所幫助2013-02-02
Asp.net core中實現(xiàn)自動更新的Option的方法示例
這篇文章主要介紹了Asp.net core中實現(xiàn)自動更新的Option的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
ASP.NET?MVC打印表格并實現(xiàn)部分視圖表格打印
這篇文章介紹了ASP.NET?MVC打印表格并實現(xiàn)部分視圖表格打印的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
asp.net 日期函數(shù) 某月的第一天和最后一天的日期
常用asp.net日期操作函數(shù)-得到某月的第一天和最后一天的日期2008-12-12

