Вопрос в том что подразумеваем под семафором. Если из java.util.concurrent, то я не хочу заморачиваться с блокировками и лучше сделаю на акторе Если, например, из zio, то там нет ничего про happens before в доке.
или вообще можно взять какой-нибудь TMap и в качестве ключа использовать индекс ячеики, которая обновляется, в качестве значения какой-нибудь TReentrantLock и лочить ячеику когда делаешь апдейт, а когда закончил убирать лок
Оно может быть и работает (прямо сейчас на каком-то железе), но контракты описаны не в терминах jmm и меня это печалит. В акотрах все просто: happens before между обработкой сообщений.