面试题答案
一键面试设计思路
- 线程安全的数据结构:选择线程安全的数据结构来存储数据,例如
ConcurrentHashMap
。 - 锁机制:使用
synchronized
关键字或者ReentrantLock
来保证在多线程读写时数据的一致性。这里使用ReentrantLock
,它提供了更灵活的锁控制,如可中断的获取锁、公平锁等特性。 - 读写锁:为了提高并发性能,采用读写锁(
ReadWriteLock
)。读操作可以并发执行,写操作需要独占锁,这样能在保证数据一致性的前提下,尽量提升系统的并发能力。 - 多线程处理:使用
Thread
类或者ExecutorService
来管理多线程。这里使用ExecutorService
,它提供了更高级的线程管理功能,如线程池的复用,任务的提交和执行控制等。
核心代码实现
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.concurrent.locks.ReadWriteLock
import java.util.concurrent.locks.ReentrantReadWriteLock
class CustomIO {
private val data: MutableMap<String, Any> = mutableMapOf()
private val lock: ReadWriteLock = ReentrantReadWriteLock()
private val executor: ExecutorService = Executors.newFixedThreadPool(10)
fun read(key: String): Any? {
lock.readLock().lock()
try {
return data[key]
} finally {
lock.readLock().unlock()
}
}
fun write(key: String, value: Any) {
lock.writeLock().lock()
try {
data[key] = value
} finally {
lock.writeLock().unlock()
}
}
fun executeReadTask(key: String): Any? {
return executor.submit { read(key) }.get()
}
fun executeWriteTask(key: String, value: Any) {
executor.submit { write(key, value) }
}
fun shutdown() {
executor.shutdown()
}
}
你可以使用以下方式测试这个类:
fun main() {
val customIO = CustomIO()
customIO.executeWriteTask("key1", "value1")
println(customIO.executeReadTask("key1"))
customIO.shutdown()
}
在上述代码中:
CustomIO
类包含一个MutableMap
来存储数据。ReadWriteLock
用于控制读写操作的并发访问。ExecutorService
用于管理多线程任务。read
方法获取读锁,读取数据后释放读锁。write
方法获取写锁,写入数据后释放写锁。executeReadTask
和executeWriteTask
方法通过ExecutorService
提交读写任务。shutdown
方法用于关闭线程池。