熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Java 中LockSupport類在C#中的實現

2013-11-13 10:03:17  來源: .NET編程 

  Java 之後提供優秀的並發庫ncurrentNet中缺乏類似的功能由於硬件體系發生了變化多核時代來臨NET中缺乏並發類庫顯然不合時宜緩解這一矛盾的其中一個辦法就是在往C#中移植java的ncurrent

  java中的ncurrent包中提供了一個類LockSupportncurrent包很多關鍵實現需要調用LockSupport如果需要把java的ncurrent包遷移到C#中LockSupport類的遷移是不可避免的問題

  在java中LockSupport類有如下方法

  以下是引用片段

  

  public static void park(Object blocker) {
  Thread t = ThreadcurrentThread();
  setBlocker(t blocker);
  unsafepark(false L);
  setBlocker(t null);
  }

  當一個線程調用LockSupportpark之後線程就會停下載類似於Objectwait或者NET中的SystemThreadingMonitorWait但問題是java中的Objectwait和NET中的Monitorwait都需要一個waitObject這個問題曾經困擾我為此翻了一遍JDK 實現源碼到最後發現的解決辦法卻是很簡單也無需了解JDK的底層實現源碼

  以下是引用片段

  

  public class LockSupport
  {
  private static LocalDataStoreSlot slot = ThreadGetNamedDataSlot
(LockSupportPark);
  public static void Park(Object blocker)
  {
  Thread thread = ThreadCurrentThread;
  ThreadSetData(slot blocker);
  lock (thread)
  {
  MonitorWait(thread);
  }
  }
  public static void Unpark(Thread thread)
  {
  if (thread == null) return;
  lock (thread)
  {
  MonitorPulse(thread);
  }
  }
  }

  其中的slot是可以不需要的但是參考JDK ncurrent的LockSupport代碼中看到使用slot(java的ThreadLocal)可以方便跟蹤調試


From:http://tw.wingwit.com/Article/program/net/201311/12409.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.