Подтвердить что ты не робот

Нужна синхронизация для счетчика с приращением?

Я использую целое число в качестве счетчика. Целое число будет только увеличено, и, конечно, более одного потока будет увеличивать его в одно и то же время. Значение этого счетчика считывается в конце выполнения программы, когда ни один другой поток не попытается получить доступ к его значению.

Я предполагаю, что мне не нужно использовать блокировку или любую синхронизацию для этого типа счетчика с приращением. Это правильно? Я код на Java, если это имеет значение.

4b9b3361

Ответ 1

Если вы просто использовали переменную int или long, тогда вам понадобится синхронизация - приращение включает чтение/инкремент-локально/запись, что далека от атомной операции. (Даже если переменная volatile, чтобы избежать проблем с моделью памяти, вы все равно должны иметь три отдельных операции с возможностью упреждения между любыми их парами.)

К счастью, Java предоставляет AtomicInteger и AtomicLong, который можно использовать без какой-либо синхронизации:

private final AtomicLong counter = new AtomicLong();

...

counter.incrementAndGet(); // No need for synchronization