c#

位置:IT落伍者 >> c# >> 浏览文章

Java 中LockSupport类在C#中的实现


发布日期:2021年11月17日
 
Java 中LockSupport类在C#中的实现

Java 之后提供优秀的并发库ncurrentNet中缺乏类似的功能由于硬件体系发生了变化多核时代来临NET中缺乏并发类库显然不合时宜缓解这一矛盾的其中一个办法就是在往C#中移植java的ncurrent

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

在java中LockSupport类有如下方法

以下是引用片段

publicstaticvoidpark(Objectblocker){

Threadt=ThreadcurrentThread();

setBlocker(tblocker);

unsafepark(falseL);

setBlocker(tnull);

}

当一个线程调用LockSupportpark之后线程就会停下载类似于Objectwait或者NET中的SystemThreadingMonitorWait但问题是java中的Objectwait和NET中的Monitorwait都需要一个waitObject这个问题曾经困扰我为此翻了一遍JDK 实现源码到最后发现的解决办法却是很简单也无需了解JDK的底层实现源码

以下是引用片段

publicclassLockSupport

{

privatestaticLocalDataStoreSlotslot=ThreadGetNamedDataSlot

(LockSupportPark);

publicstaticvoidPark(Objectblocker)

{

Threadthread=ThreadCurrentThread;

ThreadSetData(slotblocker);

lock(thread)

{

MonitorWait(thread);

}

}

publicstaticvoidUnpark(Threadthread)

{

if(thread==null)return;

lock(thread)

{

MonitorPulse(thread);

}

}

}

其中的slot是可以不需要的但是参考JDK ncurrent的LockSupport代码中看到使用slot(java的ThreadLocal)可以方便跟蹤调试

上一篇:微软.NET 4发布 18个月的明星

下一篇:.NET三层架构解析:什么是三层架构