Как работает AtomicLong

AtomicLong - это класс из пакета java.util.concurrent.atomic, который обеспечивает атомарные операции чтения и записи для типа long. Он позволяет безопасно выполнять инкрементацию, декрементацию, а также другие атомарные операции с числовыми значениями типа long в многопоточной среде.

import java.util.concurrent.atomic.AtomicLong

fun main() {
    // Создаем экземпляр AtomicLong и инициализируем его значением 0
    val atomicLong = AtomicLong(0)

    // Создаем массив потоков для инкрементации значения AtomicLong
    val threads = Array(10) {
        Thread {
            for (i in 1..1000) {
                // Инкрементируем значение AtomicLong
                atomicLong.incrementAndGet()
            }
        }
    }

    // Запускаем все потоки
    threads.forEach { it.start() }

    // Ожидаем завершения всех потоков
    threads.forEach { it.join() }

    // Выводим итоговое значение AtomicLong
    println("Final value: ${atomicLong.get()}")
}

В этом примере создается экземпляр AtomicLong с начальным значением 0. Затем создается массив из 10 потоков, каждый из которых инкрементирует значение AtomicLong 1000 раз с помощью метода incrementAndGet(). После завершения всех потоков выводится итоговое значение AtomicLong.

AtomicLong гарантирует, что операции инкрементации будут выполнены атомарно, даже при одновременном доступе из нескольких потоков. Это предотвращает гонки данных и обеспечивает безопасное обновление числовых значений в многопоточной среде.