synchronized (同步)

Synchronized 提供了一个简单 Swift 风格的锁和递归锁的实现。Lock 封装了 os_unfair_lockRecursiveLock 封装了 pthread_mutex_t。 Synchronized 的 API 设计注重便捷性和简洁性。

这两种锁的 API 是相同的,并且仅限于两个公共方法:func locked<T>(_ block: () throws -> T) rethrows -> Tfunc tryLocked(_ block: () throws -> Void) rethrowslocked() 在发生争用时阻塞,然后执行提供的闭包,返回或抛出闭包的返回值或抛出的错误。 tryLocked() 尝试获取锁。如果可以获取锁,则执行提供的闭包并返回 true。如果无法获取锁,则不执行闭包并返回 false

Synchronized 还提供了 Locked,它封装了一个实体,并且只允许通过安全方法 access(_:) 访问它。 Locked 可以轻松地确保您的类仅以安全的方式访问其可变状态。

@synchonized 替代方案

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 })

安装

Swift 包管理器

要将 Synchronized 与 Swift 包管理器一起使用,请将依赖项添加到您的 Package.swift 文件中

let package = Package(
  dependencies: [
    .package(url: "https://github.com/shareup/synchronized.git", .upToNextMajor(from: "4.0.0"))
  ]
)

目前不支持 Linux