Нужна синхронизация для счетчика только приращения? - PullRequest
29 голосов
/ 04 октября 2011

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

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

1 Ответ

67 голосов
/ 04 октября 2011

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

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

private final AtomicLong counter = new AtomicLong();

...

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