为一组令牌创建一个简单的挂起令牌锁

时间:2019-07-15 08:27:32

标签: kotlin locking coroutine suspend

我正在尝试向我的项目的一部分添加锁定功能,在此我可以同时访问多个文件。为了实现锁定,我想使用协程来防止在等待锁定时发生线程阻塞。

我将令牌存储在集合中,如果协程试图获取令牌的锁,它将检查令牌是否在集合中,如果是,它将暂停并再次检查(循环)。如果没有,它将添加令牌并返回。 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)
        }
    }
}

您能帮我验证我的解决方案是否确实有效吗?

0 个答案:

没有答案