Java util.concurrent中LockSupport类在C#中的实现

翻译|其它|编辑:郝浩|2008-03-11 10:45:29.000|阅读 816 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

      java 5之后提供优秀的并发库util.concurrent,.net中缺乏类似的功能。由于硬件体系发生了变化,多核时代来临,.NET中缺乏并发类库显然不合时宜。其中一个办法就是在往C#中移植java的util.concurrent。

  java中的util.concurrent包中提供了一个类LockSupport,util.concurrent包很多关键实现需要调用LockSupport。如果需要把java的util.concurrent包迁移到C#中,LockSupport类的迁移是不可避免的问题。

在java中,LockSupport类有如下方法:
public static void park(Object blocker) {
 Thread t = Thread.currentThread();
 setBlocker(t, blocker);
 unsafe.park(false, 0L);
 setBlocker(t, null);
}

  当一个线程调用LockSupport.park之后,线程就会停下载,类似于Object.wait,或者.NET中的System.Threading.Monitor.Wait。但问题是java中的Object.wait和.NET中的Monitor.wait,都需要一个waitObject,这个问题曾经困扰我,为此翻了一遍JDK 6实现源码,到最后发现的解决办法却是很简单,也无需了解JDK的底层实现源码。

public class LockSupport
{
 private static LocalDataStoreSlot slot = Thread.GetNamedDataSlot("LockSupport.Park");

 public static void Park(Object blocker)
 {
  Thread thread = Thread.CurrentThread;
  Thread.SetData(slot, blocker);
  lock (thread)
  {
   Monitor.Wait(thread);
  }
 }

 public static void Unpark(Thread thread)
 {
  if (thread == null) return;

   lock (thread)
  {
   Monitor.Pulse(thread);
  }
 }
}
  其中的slot是可以不需要的,但是参考JDK util.concurrent的LockSupport代码中看到,使用slot(java的ThreadLocal)可以方便跟踪调试。
标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP