面试题答案
一键面试设计思路
- 使用枚举类管理订单状态:Kotlin 的枚举类可以方便地定义和管理有限个状态值。
- 状态转换机制:通过使用
synchronized
关键字或者AtomicReference
来确保多线程环境下状态转换的原子性,避免状态不一致。 - 性能优化:尽量减少锁的使用范围,只在必要的状态转换操作时加锁,或者使用更细粒度的锁。使用
AtomicReference
相比synchronized
可能在高并发下有更好的性能,因为它使用非阻塞算法。
核心代码示例
使用 synchronized
关键字
enum class OrderStatus {
Pending, Processing, Completed, Failed
}
class Order {
private var status: OrderStatus = OrderStatus.Pending
fun transitionStatus(newStatus: OrderStatus) {
synchronized(this) {
when (status) {
OrderStatus.Pending -> if (newStatus == OrderStatus.Processing) status = newStatus
OrderStatus.Processing -> when (newStatus) {
OrderStatus.Completed, OrderStatus.Failed -> status = newStatus
else -> throw IllegalArgumentException("Invalid status transition from Processing")
}
else -> throw IllegalArgumentException("Invalid status transition")
}
}
}
fun getStatus(): OrderStatus {
return status
}
}
使用 AtomicReference
import java.util.concurrent.atomic.AtomicReference
enum class OrderStatus {
Pending, Processing, Completed, Failed
}
class Order {
private val statusRef = AtomicReference(OrderStatus.Pending)
fun transitionStatus(newStatus: OrderStatus) {
val currentStatus = statusRef.get()
when (currentStatus) {
OrderStatus.Pending -> if (newStatus == OrderStatus.Processing) {
statusRef.compareAndSet(currentStatus, newStatus)
}
OrderStatus.Processing -> when (newStatus) {
OrderStatus.Completed, OrderStatus.Failed -> statusRef.compareAndSet(currentStatus, newStatus)
else -> throw IllegalArgumentException("Invalid status transition from Processing")
}
else -> throw IllegalArgumentException("Invalid status transition")
}
}
fun getStatus(): OrderStatus {
return statusRef.get()
}
}
在实际应用中,根据系统的并发特性和性能需求选择合适的方案。如果锁的竞争不激烈,synchronized
关键字简单直观;如果是高并发场景,AtomicReference
可能更合适。