首页 »DotNet » java中接口的实现:Java 中LockSupport类在C#中的实现 »正文
java中接口的实现:Java 中LockSupport类在C#中的实现
来源: 发布时间:星期五, 2009年1月9日 浏览:16次 评论:0
Java 5的后提供优秀 ![](/icons/34478de.gif) 并发库util.concurrent ![](/icons/34478dou.gif) .Net中缺乏类似 ![](/icons/34478de.gif) 功能 ![](/icons/34478dou2.gif) 由于硬件体系发生了变化 ![](/icons/34478dou.gif) 多核时代来临 ![](/icons/34478dou.gif) .NET中缺乏并发类库显然不合时宜 ![](/icons/34478dou2.gif) 缓解这 ![](/icons/34478yi.gif) 矛盾 ![](/icons/34478de.gif) 其中 ![](/icons/34478yi.gif) 个办法就是在往C#中移植java ![](/icons/34478de.gif) util.concurrent ![](/icons/34478dou2.gif) java中 ![](/icons/34478de.gif) util.concurrent包中提供了 ![](/icons/34478yi.gif) 个类LockSupport ![](/icons/34478dou.gif) util.concurrent包很多关键实现需要 ![](/icons/34478diaoyong.gif) LockSupport ![](/icons/34478dou2.gif) 如果需要把java ![](/icons/34478de.gif) util.concurrent包迁移到C#中 ![](/icons/34478dou.gif) LockSupport类 ![](/icons/34478de.gif) 迁移是不可避免 ![](/icons/34478de.gif) 问题 ![](/icons/34478dou2.gif) 在java中 ![](/icons/34478dou.gif) LockSupport类有如下思路方法: 以下是引用片段: public voidpark(Objectblocker){ Threadt=Thread.currentThread ; Blocker(t,blocker); unsafe.park(false,0L); Blocker(t,null); } 当 ![](/icons/34478yi.gif) 个线程 ![](/icons/34478diaoyong.gif) LockSupport.park的后 ![](/icons/34478dou.gif) 线程就会停下载 ![](/icons/34478dou.gif) 类似于Object.wait ![](/icons/34478dou.gif) 或者.NET中 ![](/icons/34478de.gif) ![](/icons/34478System.gif) .Threading.Monitor.Wait ![](/icons/34478dou2.gif) 但问题是java中 ![](/icons/34478de.gif) Object.wait和.NET中 ![](/icons/34478de.gif) Monitor.wait ![](/icons/34478dou.gif) 都需要 ![](/icons/34478yi.gif) 个waitObject ![](/icons/34478dou.gif) 这个问题曾经困扰我 ![](/icons/34478dou.gif) 为此翻了 ![](/icons/34478yi.gif) 遍JDK 6实现源码 ![](/icons/34478dou.gif) 到最后发现 ![](/icons/34478de.gif) 解决办法却是很简单 ![](/icons/34478dou.gif) 也无需了解JDK ![](/icons/34478de.gif) 底层实现源码 ![](/icons/34478dou2.gif) 以下是引用片段: public LockSupport { private LocalDataStoreSlotslot=Thread.GetNamedDataSlot("LockSupport.Park"); public voidPark(Objectblocker) { Threadthread=Thread.CurrentThread; Thread.SetData(slot,blocker); lock(thread) { Monitor.Wait(thread); } } public voidUnpark(Threadthread) { (thread null) ; lock(thread) { Monitor.Pulse(thread); } } } 其中 ![](/icons/34478de.gif) slot是可以不需要 ![](/icons/34478de.gif) ![](/icons/34478dou.gif) 但是参考JDK util.concurrent ![](/icons/34478de.gif) LockSupport代码中看到 ![](/icons/34478dou.gif) 使用slot(java ![](/icons/34478de.gif) ThreadLocal)可以方便跟踪调试
相关文章
读者评论
发表评论
|
|