Java 中LockSupport类在C#中的实现

转帖|其它|编辑:郝浩|2010-10-11 14:04:27.000|阅读 695 次

概述:Java 5之后提供优秀的并发库 util.concurrent。Net 中缺乏类似的功能。由于硬件体系发生了变化,多核时代来临,。NET 中缺乏并发类库显然不合时宜。缓解这一矛盾的其中一个办法就是在往 C#中移植 java 的 util.concurrent.本文将介绍Java 中LockSupport类在C#中的实现的问题。

# 界面/图表报表/文档/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