锁定 .NET 与 Java 的成本
我正在玩Disruptor框架及其用于.NET平台的端口,并发现了一个有趣的案例。可能是我完全错过了一些东西,所以我正在寻找全能社区的帮助。
long iterations = 500*1000*1000;
long testValue = 1;
//.NET 4.0. Release build. Mean time - 26 secs;
object lockObject = new object();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
lock (lockObject)
{
testValue++;
}
}
sw.Stop();
//Java 6.25. Default JVM params. Mean time - 17 secs.
Object lock = new Object();
long start = System.currentTimeMillis();
for (int i = 0; i < iterations; i++)
{
synchronized (lock)
{
testValue++;
}
}
long stop = System.currentTimeMillis();
似乎在.NET中使用 signle 线程获取场景中的锁的成本仅比在 Java 中高出 50%。起初我对计时器持怀疑态度,但我已经运行了几次相同的测试,结果与上述平均值差不多。然后我对同步代码块持怀疑态度,但它所做的不仅仅是monitorenter / monitorexit字节代码指令 - 与.NET中的lock关键字相同。任何其他想法为什么在.NET与Java中采用锁如此昂贵?