ReadWriteLock
ReadWriteLock 是一个轻量级框架,用于在 iOS、macOS、tvOS 和 watchOS 中安全且易于实现读/写锁。
安装
ReadWriteLock 通过 CocoaPods、Carthage 和 Swift 包管理器 提供。
要通过 CocoaPods 安装,只需在 Podfile 中添加以下行
pod 'ReadWriteLock'
要通过 Carthage 安装,只需在 Cartfile 中添加以下行
github "SomeRandomiOSDev/ReadWriteLock"
要通过 Swift 包管理器安装,请在 Package.swift
文件的 dependencies
部分添加以下行
.package(url: "https://github.com/SomeRandomiOSDev/ReadWriteLock.git", from: "1.0.0")
使用方法
首先,在 Swift 文件顶部导入 ReadWriteLock
import ReadWriteLock
导入后,创建一个 ReadWriteLock
实例并开始获取锁
let lock = ReadWriteLock()
var protectedResource = ...
DispatchQueue.global(qos: .background).async {
...
lock.acquireWriteLock {
protectedResource = ...
}
}
...
DispatchQueue.global(qos: .background).async {
...
lock.acquireReadLock {
process(protectedResource)
}
}
或者你可以尝试条件性地获取锁。以这种方式获取锁不会阻塞,如果锁已被占用
...
lock.attemptAcquireReadLock { isLockAcquired in
if isLockAcquired {
process(protectedResource)
} else {
// `lock` is currently locked for writing.
}
}
获取锁使用 Swift 闭包来封装读写锁的生命周期。这防止了在释放 ReadWriteLock
对象时产生悬挂锁,并有助于防止死锁。请注意,如果你尝试在已获取读或写锁的作用域内获取写锁,或者获取写锁的作用域内获取读锁,线程将发生死锁
// All of these code blocks will deadlock
lock.acquireWriteLock {
...
lock.acquireWriteLock {
// deadlock
}
}
lock.acquireReadLock {
...
lock.acquireWriteLock {
// deadlock
}
}
lock.attemptAcquireWriteLock { isLockAcquired in
...
if isLockAcquired {
lock.acquireWriteLock {
// deadlock
}
}
}
...
与传统的锁相比,读写锁的好处是你可能有(实际上是)无限多的读锁,甚至是嵌套的读锁,而不会发生死锁
lock.acquireReadLock {
...
lock.acquireReadLock {
// won't deadlock
}
lock.attemptAcquireReadLock { isLockAcquired in
// isLockAcquired is `true`
}
}
读写锁非常适合同步访问属性
struct SynchronizedValue<T> {
private var lock = ReadWriteLock()
private var _value: T
var value: T {
get {
return lock.acquireReadLock { _value }
}
set {
lock.acquireWriteLock { _value = newValue }
}
}
}
贡献
如果您需要特定功能或遇到bug,请提交一个问题。如果您自己扩展了ReadWriteLock的功能或想要自己修复bug,请提交一个pull请求。
作者
Joe Newton, [邮箱地址保护,请手动删除此行]
许可证
ReadWriteLock在MIT许可证下可用。有关更多信息,请参阅LICENSE
文件。