Я играл с Disruptor framework и его порт для платформы .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();
Кажется, что приобретение блокировки в сценарии с потоком signle в .NET стоит всего на 50% больше, чем на Java. Сначала я подозрительно относился к таймерам, но несколько раз я запускал один и тот же тест с результатами только упомянутых выше средних значений. Тогда я был подозрителен к синхронизированному блоку кода, но он делает не более, чем просто команды monitorenter/monitorexit байт кода - то же самое, что и ключевое слово lock в .NET. Любые другие идеи, почему использование блокировки так дорого в .NET и Java?