Помните, оба очень быстры;мы говорим о 50 циклах ЦП для блокировки-чтения-записи-разблокировки.
В Java я сравнил его с имитацией impl в неконтролируемом случае
volatile int waitingList=0;
AtomicInteger x = new AtomicInteger(0);
for (int i = 0; i < iterations; i++)
{
while( ! x.compareAndSet(0, 1) )
;
testValue++;
if(waitingList!=0)
;
x.set(0);
}
немного быстрее, чем версия synchronized
, затраченное время составляет 15 / 17.
Это показывает, что в вашем тестовом примере Java не делала сумасшедших оптимизаций, она честно делала lock-read-update-unlockкаждая итерация.Тем не менее, импл Java так же быстр, как имплант голой кости;это не может быть быстрее.
Хотя impl в C # также близок к минимуму, он, очевидно, делает на одну или две вещи больше, чем Java.Я не знаком с C #, но это, вероятно, указывает на некоторое различие в семантике, поэтому C # должен сделать что-то дополнительное.