.Net Core中ObjectPool的使用與源碼解析
一、對(duì)象池
運(yùn)用對(duì)象池化技術(shù)可以顯著地提升性能,尤其是當(dāng)對(duì)象的初始化過(guò)程代價(jià)較大或者頻率較高。下面是ObjectPool源碼中涉及的幾個(gè)類。當(dāng)你看過(guò).Net Core源碼很多時(shí),你會(huì)發(fā)現(xiàn),微軟的開(kāi)發(fā)很多都是這種模式,通過(guò)Policy構(gòu)建Provider,通過(guò)Provider創(chuàng)建最終的類。
二、使用
這個(gè)組件的目的主要是將對(duì)象保存到對(duì)象池,用的時(shí)候直接去取,不需要重新創(chuàng)建,實(shí)現(xiàn)對(duì)象的重復(fù)利用。但是有個(gè)問(wèn)題,假如對(duì)象池中開(kāi)始沒(méi)有對(duì)象或者取得數(shù)量大于對(duì)象池中的數(shù)量怎么辦?在對(duì)象池中對(duì)象的數(shù)量不足時(shí),此時(shí)來(lái)取對(duì)象,需要通過(guò)Policy創(chuàng)建對(duì)象,至于怎么創(chuàng)建對(duì)象,是你需要實(shí)現(xiàn)的。Policy如上圖,有個(gè)默認(rèn)實(shí)現(xiàn) DefaultPooledObjectPolicy ,它的創(chuàng)建就是 new T().
DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new DefaultPooledObjectPolicy<User>(), 2);
var firstUser=defaultPool.Get();//從對(duì)象池中取一個(gè)對(duì)象,此時(shí)對(duì)象池中還沒(méi)有對(duì)象,返回 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);//將對(duì)象放回對(duì)象池中,但是不一定成功。對(duì)象池有數(shù)量限制,而且也可以自定義限制,讓一些對(duì)象不能放入對(duì)象池中
defaultPool.Return(user2);
defaultPool.Return(user3);
var u1 = defaultPool.Get();//從對(duì)象池中取一個(gè)對(duì)象,返回第一個(gè)放入的user1
var u2 = defaultPool.Get();//從對(duì)象池中取一個(gè)對(duì)象,返回第二個(gè)放入的user2
var u3 = defaultPool.Get();//此時(shí)對(duì)象池中沒(méi)有對(duì)象了,獲取對(duì)象調(diào)用的Policy的Create方法,而DefaultPooledObjectPolicy的Create方法的實(shí)現(xiàn)是:new T(),所以返回 Age=0 Name=null
上面例子當(dāng)對(duì)象池中沒(méi)有對(duì)象是,調(diào)取獲取方法,其實(shí)就是new T()。下面在對(duì)象中添加3個(gè)對(duì)象,但是對(duì)象池中只有2個(gè)空間,所以第三個(gè)是添加不進(jìn)去的。
現(xiàn)在自己創(chuàng)建一個(gè)的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 因?yàn)閡ser1的Age=18,policy中Reture篩選條件 返回false,導(dǎo)致第一個(gè)user不能放入連接池中。
var u2 = defaultPool.Get();//返回user3
var u3 = defaultPool.Get();//返回 Age=18 Name=MicroHeart 這個(gè)是使用 Policy中的Create創(chuàng)建
三、源碼解析
IPooledObjectPolicy<T>: 主要作用是創(chuàng)建對(duì)象和將對(duì)象放入連接池中
Create:定義一個(gè)創(chuàng)建對(duì)象的方法,當(dāng)連接池中的數(shù)量不夠取的時(shí)候,通過(guò)此方法創(chuàng)建對(duì)象。
Return:將對(duì)象放入連接池中,如果放入成功,返回Ture.否則返回False.
DefaultPooledObjectPolicy<T>:繼承抽象類PooledObjectPolicy<T>,而抽抽象類繼承接口 IPooledObjectPolicy<T>。Policy的默認(rèn)實(shí)現(xiàn)類
Create:定義一個(gè)默認(rèn)創(chuàng)建對(duì)象的方法 new T();
Return:不論是否放入連接池,全部返回True.
ObjectPoolProvider:創(chuàng)建對(duì)象池(ObjectPool)
abstract ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy):通過(guò)Policy創(chuàng)建ObjectPool
DefaultObjectPoolProvider:ObjectPoolProvider的默認(rèn)實(shí)現(xiàn)類
ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy) :創(chuàng)建一個(gè)可以容納處理器數(shù)量X2的對(duì)象池。
ObjectPool<T>:對(duì)象池
T Get():從對(duì)象池中獲取對(duì)象。
void Return(T obj):將對(duì)象放入對(duì)象池中。
DefaultObjectPool:對(duì)象池的默認(rèn)實(shí)現(xiàn)類,它實(shí)現(xiàn)了Get和Return方法。其實(shí)對(duì)象池的本質(zhì)就是它的中的 ObjectWrapper[] _items; ,當(dāng)使用Return方法是,將對(duì)象放入 ObjectWrapper數(shù)組中。Get方法從數(shù)組中取。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)我們的支持。
上一篇:.NET資源泄露與處理方案知識(shí)點(diǎn)分享
欄 目:ASP.NET
下一篇:詳解在ASP.NET Core中如何編寫(xiě)合格的中間件
本文標(biāo)題:.Net Core中ObjectPool的使用與源碼解析
本文地址:http://www.jygsgssxh.com/a1/ASP_NET/10856.html
您可能感興趣的文章
- 01-11如何給asp.net core寫(xiě)個(gè)簡(jiǎn)單的健康檢查
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時(shí)
- 01-11.NET開(kāi)發(fā)人員關(guān)于ML.NET的入門(mén)學(xué)習(xí)
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件
- 01-11.net core EF Core調(diào)用存儲(chǔ)過(guò)程的方式


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11vscode extension插件開(kāi)發(fā)詳解
- 01-11VsCode插件開(kāi)發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫(xiě)個(gè)簡(jiǎn)單的健康檢查
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.NET開(kāi)發(fā)人員關(guān)于ML.NET的入門(mén)學(xué)習(xí)
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子


