Задать вопрос
Ответы пользователя по тегу Java
  • Как обеспечить производительность в многопоточной среде?

    knott
    @knott
    Полностью согласен 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 выполняются быстро. Иначе ваш код будет только и ждать освобождения блокировки, совершенно бездарно тратя циклы ЦП.
    • многопроцессорная система. Нет смысла ждать освобождения блокировки сделанной на другом потоке.
    Ответ написан