Полностью согласен c товарищем gvsmirnov.
Однако, мне кажется, что производительность проседает из-за оверхеда на планировщик, при неудачном взятии потоком блокировки. Поэтому, мне кажется что здесь имеет место быть спинлок на основании
AtomicBoolean
.
public class OrderService {
private AtomicBoolean locked = new AtomicBoolean(false);
public Order create(Order order, Long companyId) {
Order result;
// Пробовать зайти в крит. секцию.
while (!locked.compareAndSet(false, true)) {
Company company = companyService.get(companyId);
checkCompanyBalance(company.getBalance(), order.getSum());
result = create(order);
// Открыть путь другим потокам.
locked.set(false);
break;
}
return result;
}
}
Однако этот подход годится только если:
- методы
checkCompanyBalance
и create
выполняются быстро. Иначе ваш код будет только и ждать освобождения блокировки, совершенно бездарно тратя циклы ЦП.
- многопроцессорная система. Нет смысла ждать освобождения блокировки сделанной на другом потоке.