Synchronized 提供了一个简单 Swift 风格的锁和递归锁的实现。Lock
封装了 os_unfair_lock
。RecursiveLock
封装了 pthread_mutex_t
。 Synchronized 的 API 设计注重便捷性和简洁性。
这两种锁的 API 是相同的,并且仅限于两个公共方法:func locked<T>(_ block: () throws -> T) rethrows -> T
和 func tryLocked(_ block: () throws -> Void) rethrows
。 locked()
在发生争用时阻塞,然后执行提供的闭包,返回或抛出闭包的返回值或抛出的错误。 tryLocked()
尝试获取锁。如果可以获取锁,则执行提供的闭包并返回 true
。如果无法获取锁,则不执行闭包并返回 false
。
Synchronized 还提供了 Locked
,它封装了一个实体,并且只允许通过安全方法 access(_:)
访问它。 Locked
可以轻松地确保您的类仅以安全的方式访问其可变状态。
Synchronized 最初是一个简单(且简化)的 Objective-C 的 @synchronized 的 Swift 重新实现。如果您对该版本感兴趣,您应该查看 v1.2.1。
let lock = Lock()
let lockInput: Int = 0
let lockOutput = lock.locked { lockInput + 1 }
XCTAssertEqual(1, lockOutput)
let recursiveLock = RecursiveLock()
let recursiveLockInput: Int = 0
let recursiveLockOutput = recursiveLock.locked { recursiveLockInput + 1 }
XCTAssertEqual(1, recursiveLockOutput)
let lockedInput = Locked(0)
lockedInput.access { $0 += 1 }
XCTAssertEqual(1, lockedInput.access { $0 })
要将 Synchronized 与 Swift 包管理器一起使用,请将依赖项添加到您的 Package.swift 文件中
let package = Package(
dependencies: [
.package(url: "https://github.com/shareup/synchronized.git", .upToNextMajor(from: "4.0.0"))
]
)
目前不支持 Linux