Я пытался сократить конфликт потоков в моем коде, заменив некоторые блоки synchronized
на AtomicBoolean
].
Вот пример с синхронизированным
:
public void toggleCondition() {
synchronized (this.mutex) {
if (this.toggled) {
return;
}
this.toggled = true;
// do other stuff
}
}
И альтернатива с AtomicBoolean
:
public void toggleCondition() {
if (!this.condition.getAndSet(true)) {
// do other stuff
}
}
Использование AtomicBoolean
' s Свойство CAS должно быть намного быстрее, чем полагаться на синхронизацию, поэтому я провел небольшой микротест .
Для 10 параллельных потоков и 1000000 итераций AtomicBoolean
работает лишь немного быстрее, чем синхронизированный блок
.
Среднее время (на поток), затраченное на toggleCondition () с AtomicBoolean: 0,0338
Среднее время (на поток), затраченное на toggleCondition () с синхронизированным: 0,0357
Я знаю микро-тесты стоят того, чего они стоят, но не должна ли разница быть выше?