MST

星途 面试题库

面试题:Kotlin中原子变量的基本使用

在Kotlin中,如何使用原子整型变量`AtomicInteger`来实现线程安全的计数器?请给出具体代码示例,并解释其工作原理。
39.0万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

代码示例

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()}")
}

工作原理

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