|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
有个问题想请教你一下,呵呵:)你觉得将来学什么方向比较好,我真是想不出来,知道的太少了,麻烦了。年夜部分线程平安的汇合都有一些基本性的缺点:固然每一个操纵都是线程平安的,可是多个操纵没法组合起来利用。这意味着一些基础的实行按次,比方在弹召盘部元素之前反省栈内元素数目会呈现潜伏的伤害。只管已有一些API想法将某些操纵绑定起来(比方.NET4的CoordinationDataStructures),可是它们常常会引进丑恶的办法(如TryDequeue)。
.NET1里的汇合实验了另外一种体例,它们会对外表露一个SyncRoot属性,而不是在外部举行锁定。固然SyncRoot仍旧是同步对象的默许机制,可是.NET2已丢弃了SyncRoot/Wrapper计划形式。
那末该怎样创立一个可用的组合式API呢?JaredParson以为汇合不该该间接表露出线程平安的API,一切的办法都应当属于一个一时的对象,而这个对象只要在您锁定汇合的时分才被创立出来。这个一时对象是汇合的“钥匙”,只要钥匙的持有者才干猎取汇合内容。
以下示例为JaredParsons的线程平安行列:- staticvoidExample1(ThreadSafeQueuequeue){using(varlocked=queue.Lock()){if(locked.Count>0){varfirst=locked.Dequeue();}}}
复制代码 名为locked的对象自己不是线程平安的,可是开辟职员只要在using代码块中才干准确实行操纵。在恪守了这一复杂划定规矩以后,开辟块里的一切代码就是线程平安的。Jared注释道:与年夜部分线程平安的计划一样,这些代码仍是有被误用的大概:
- 在ILockedQueue烧毁以后却持续利用它。这类做法应当被克制,用户现有的常识一样平常足以免这个成绩。别的一些静态反省工具,比方FxCop,会把这类做法辨认为一个毛病。我们也能够利用一种更严峻的做法来制止此类情形呈现:增加一个disposed标志,并在每一个办法中举行反省。
- 假如用户在超过多个Lock语句的情形下保存某个值(比方Count),那末大概会对汇合的情况呈现毛病的判别和假定。
- 假如用户没有准确烧毁ILockedQueue,那末这个对象会被永世锁定。侥幸的是,关于完成了IDisposable的对象,FxCop一样会将这类做法辨认为一个毛病——只管这不是一个万分稳妥的机制。
- 没法断定用户是不是会临时持有ILockedQueue对象。固然IDisposable一样平常包括着“短时间”的意味,可是这其实不能做出完善的包管。
- ILockedQueue并非线程平安的。固然一样平常情形下用户不会把IDisposable对象交给多个线程利用,但这也是必需思索到的情形之一。
检察英文原文:BuildingaBetterThread-safeCollection
本文出自:http://www.infoq.com/cn/news/2009/02/Threaded-Collections
如果英语好,口才好,加上女孩子的优势说不定有机会进去做做别的工具) |
|