自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.NET 4.0 Beta 2改進(jìn)對(duì)協(xié)調(diào)數(shù)據(jù)結(jié)構(gòu)類庫

開發(fā) 后端
在這里我們將討論的是.NET 4.0 Beta 2改進(jìn)對(duì)協(xié)調(diào)數(shù)據(jù)結(jié)構(gòu)類庫,希望本文對(duì)大家有所幫助。

對(duì)于.NET 4.0 Beta 2,大家可能還處于試用階段,本文將討論的是.NET 4.0 Beta 2改進(jìn)對(duì)協(xié)調(diào)數(shù)據(jù)結(jié)構(gòu)類庫,希望對(duì)大家有所幫助。

協(xié)調(diào)數(shù)據(jù)結(jié)構(gòu)(Coordination Data Structures,CDS)被設(shè)計(jì)為在并發(fā)環(huán)境下使用的組件,它也可用于構(gòu)建復(fù)雜的并發(fā)框架。此外,它還包含了高級(jí)的同步工具,如Barrier,多種線程安全的集合,以及多種構(gòu)建Future模型的方式。

#T#

Barrier類的作用是在多個(gè)階段的操作之間創(chuàng)建同步點(diǎn)。在使用之前,Barrier需要知道有多少線程將會(huì)使用它。每個(gè)線程達(dá)到檢查點(diǎn)時(shí),便要調(diào)用Barrier的SignalAndWait方法。這么做會(huì)引起阻塞,當(dāng)所有線程都調(diào)用了這個(gè)方法后,便會(huì)同時(shí)釋放所有線程。這個(gè)過程可以重復(fù)多次,每個(gè)這樣的迭代都會(huì)增加其CurrentPhaseNumber屬性。用于監(jiān)控的代碼可以隨時(shí)檢查正在使用Barrier的線程,以及還沒有到達(dá)檢查點(diǎn)的線程數(shù)量。CurrentPhaseNumber為Int64類型,因此每個(gè)Barrier可以支持多達(dá)9,223,372,036,854,775,807個(gè)階段(之前的beta版本使用Int32,因此受限于40億個(gè)階段)。

BlockingCollection類用于生產(chǎn)者/消費(fèi)者場景。它最簡單的使用模式便是作為一個(gè)線程安全的隊(duì)列,并且在隊(duì)列為空時(shí)阻塞消費(fèi)者。為了避免隊(duì)列元素過多,你也可以為它設(shè)置一個(gè)最大值。在到達(dá)最大容量時(shí),生產(chǎn)者便會(huì)被阻塞,直到某個(gè)消費(fèi)者取出元素。當(dāng)BlockingCollection填充完畢之后,生產(chǎn)者可以將其標(biāo)記為完成。這樣便無法添加更多的元素,同時(shí)也會(huì)釋放了所有的消費(fèi)者。

BlockingCollection并非只能單獨(dú)使用,多個(gè) BlockingCollection可以一起使用。在這種模式下,生產(chǎn)者和消費(fèi)者可以指明為任意一個(gè)BlockingCollection添加或刪除元素,而不在乎某個(gè)特定的集合。這么做可以充分在集合之間的實(shí)現(xiàn)某種負(fù)載均衡。

ConcurrentDictionary類支持原子性的添加和更新操作。為了實(shí)現(xiàn)這個(gè)功能,你需要向GetOrAdd及AddOrUpdate方法中傳入一個(gè)委托。如果當(dāng)前鍵不在集合中便會(huì)調(diào)用Add委托。如果鍵存在,那么便會(huì)返回對(duì)應(yīng)的值,或是將其傳遞給Update委托。

原本還有計(jì)劃實(shí)現(xiàn)一個(gè)并行鏈表,但是這點(diǎn)在beta 2中被取消了。Joshua Phillips寫到,他們無法為這個(gè)類在性能和可用性之間做出平衡:

在每個(gè)軟件專業(yè)人士的職業(yè)生涯中,總會(huì)遇到某些情況需要放棄他們所鐘愛的東西。他們的發(fā)明雖然很棒,但總會(huì)有這樣那樣的原因,導(dǎo)致這些東西失去存在的充分價(jià)值。我知道你們對(duì)Beta 1中的ConcurrentLinkedList很感興趣,但是我們打算放棄它了(雖然之前我們沒有給出提示)。很不幸,經(jīng)過一段時(shí)間的研究,我們發(fā)現(xiàn)無法同時(shí)提供很好的可用性以及性能。似乎目前已經(jīng)有許多線程安全的鏈表實(shí)現(xiàn),它們的伸縮性很好,但是這種高度伸縮能力是建立在某些假設(shè)或是一些奇怪的設(shè)計(jì)方式上的,它們總會(huì)在一些特別的情況下引起嚴(yán)重的性能問題。移除CLL讓我們很受傷,但是它的性能的確無法滿足發(fā)布的要求。

對(duì)于需要延遲執(zhí)行的函數(shù),目前有了兩個(gè)選擇。如果你想使用future模型來傳遞那些只在需要時(shí)才調(diào)用的函數(shù),那么可以使用Lazy類。這個(gè)類封裝了一個(gè)函數(shù),保證它只在第一次訪問Value屬性的時(shí)候才執(zhí)行,以后對(duì)于Value屬性的多次訪問不會(huì)引起函數(shù)的重復(fù)調(diào)用。

第二個(gè)選項(xiàng)則是LazyInitializer模塊。EnsureInitialized方法是一個(gè)保證初始化完成的輕量級(jí)做法,它在(且僅在)目標(biāo)變量為null的情況才調(diào)用委托。這保證了目標(biāo)變量只會(huì)設(shè)置一次。不過,如果沒有使用同步對(duì)象的話,委托可能會(huì)被幾個(gè)并發(fā)線程調(diào)用多次。

責(zé)任編輯:彭凡 來源: InfoQ
相關(guān)推薦

2009-10-26 09:16:08

BigInteger類

2009-07-30 13:17:44

STM.NET.NET 4 Beta

2009-08-03 09:21:35

.NET 4.0 Be.NET

2009-05-08 10:09:30

.NET4.0PLINQ

2010-07-19 09:01:54

.NET 4.0緩存

2009-09-04 16:28:05

ASP.NET 4.0

2009-07-10 09:41:08

WCF服務(wù)配置.NET 4.0

2010-01-27 15:58:35

C++數(shù)據(jù)結(jié)構(gòu)

2009-07-14 17:10:44

struts2webwork

2019-06-12 22:51:57

Redis軟件開發(fā)

2011-03-31 15:41:51

Cacti數(shù)據(jù)表結(jié)構(gòu)

2023-10-31 08:51:25

數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)

2012-04-28 14:21:47

Java數(shù)據(jù)結(jié)構(gòu)線性結(jié)構(gòu)

2013-07-30 14:10:51

iOS 7 Beta

2009-12-21 14:55:49

ADO.NET類庫

2020-10-21 14:57:04

數(shù)據(jù)結(jié)構(gòu)算法圖形

2021-05-12 14:09:35

鏈表數(shù)據(jù)結(jié)構(gòu)線性結(jié)構(gòu)

2021-08-03 10:24:59

數(shù)據(jù)跳躍鏈表結(jié)構(gòu)

2023-11-12 21:49:10

Redis數(shù)據(jù)庫

2010-06-30 09:26:43

Firefox 4.0
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)