MST

星途 面试题库

面试题:Kotlin Android多线程编程的线程安全问题

在Kotlin Android多线程环境下,假设存在多个协程同时访问和修改一个共享的可变数据结构(如MutableList),请描述可能出现的线程安全问题,并提供至少两种不同的解决方案,包括使用锁机制和Kotlin的线程安全数据结构。
45.8万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

可能出现的线程安全问题

  1. 数据竞争:多个协程同时读写MutableList,可能导致数据不一致。例如,一个协程正在向列表中添加元素,另一个协程同时尝试读取列表,可能会读到不完整或错误的数据。
  2. 并发修改异常:当一个协程在遍历MutableList时,另一个协程对其进行修改,可能会抛出ConcurrentModificationException

解决方案

  1. 使用锁机制
    import kotlinx.coroutines.*
    import java.util.concurrent.locks.ReentrantLock
    
    val lock = ReentrantLock()
    val sharedList = mutableListOf<Int>()
    
    fun main() = runBlocking {
        val jobs = List(10) {
            launch {
                lock.lock()
                try {
                    sharedList.add(it)
                    println("Added $it to the list. Current list: $sharedList")
                } finally {
                    lock.unlock()
                }
            }
        }
        jobs.forEach { it.join() }
    }
    
  2. 使用Kotlin的线程安全数据结构 - ConcurrentLinkedDeque
    import kotlinx.coroutines.*
    import java.util.concurrent.ConcurrentLinkedDeque
    
    val sharedList = ConcurrentLinkedDeque<Int>()
    
    fun main() = runBlocking {
        val jobs = List(10) {
            launch {
                sharedList.add(it)
                println("Added $it to the list. Current list: $sharedList")
            }
        }
        jobs.forEach { it.join() }
    }
    
  3. 使用Kotlin的线程安全数据结构 - Collections.synchronizedList
    import kotlinx.coroutines.*
    import java.util.*
    
    val sharedList = Collections.synchronizedList(mutableListOf<Int>())
    
    fun main() = runBlocking {
        val jobs = List(10) {
            launch {
                sharedList.add(it)
                println("Added $it to the list. Current list: $sharedList")
            }
        }
        jobs.forEach { it.join() }
    }