代码示例
import java.util.concurrent.atomic.AtomicInteger
fun main() {
val counter = AtomicInteger(0)
// 模拟多个线程对计数器进行操作
val threads = List(10) {
Thread {
repeat(1000) {
counter.incrementAndGet()
}
}
}
threads.forEach { it.start() }
threads.forEach { it.join() }
println("Final counter value: ${counter.get()}")
}
工作原理
- 创建原子整型变量:
val counter = AtomicInteger(0)
创建了一个初始值为0的 AtomicInteger
对象。AtomicInteger
类提供了一系列原子操作方法,这些操作保证在多线程环境下的线程安全性。
- 多线程操作计数器:通过创建10个线程,每个线程对计数器进行1000次
incrementAndGet
操作。incrementAndGet
方法会以原子方式将当前值加1并返回新的值。由于 AtomicInteger
使用了底层的硬件原语(如CAS - Compare and Swap)来实现原子操作,所以在多线程并发访问时,不会出现竞态条件。
- 等待所有线程完成:
threads.forEach { it.start() }
启动所有线程,threads.forEach { it.join() }
等待所有线程执行完毕。这样可以确保在输出最终计数器值之前,所有线程的操作都已完成。
- 获取最终计数器值:
counter.get()
获取 AtomicInteger
当前的值并输出。由于所有对 AtomicInteger
的操作都是线程安全的,所以最终输出的值是所有线程操作后的正确结果。