我正在尝试向我的项目的一部分添加锁定功能,在此我可以同时访问多个文件。为了实现锁定,我想使用协程来防止在等待锁定时发生线程阻塞。
我将令牌存储在集合中,如果协程试图获取令牌的锁,它将检查令牌是否在集合中,如果是,它将暂停并再次检查(循环)。如果没有,它将添加令牌并返回。 tokenSet
上的所有访问都使用暂停的Mutex
进行同步。这样可以防止同时访问集合并创建类似原子的checkAddToken
。
object LockManager {
private val tokenMap = mutableSetOf<String>()
private val mutex = Mutex()
suspend fun lock(token: String) {
while (checkAddToken(token)) {
yield()
}
}
private suspend fun checkAddToken(token: String): Boolean {
mutex.withLock {
return if (tokenMap.contains(token)) {
true
} else {
tokenMap.add(token)
false
}
}
}
suspend fun unlock(token: String) {
removeLockToken(token)
}
private suspend fun removeLockToken(token: String) {
mutex.withLock { tokenMap.remove(token) }
}
suspend fun <T> withLock(token: String, action: () -> T): T {
lock(token)
try {
return action()
} finally {
unlock(token)
}
}
}
您能帮我验证我的解决方案是否确实有效吗?