使用 GCD 同步 Swift 3 中的属性

Synchronize Properties in Swift 3 using GCD

我看了今年的 WWDC GCD 最近的谈话,我认为有一个代码片段有问题。它是关于使用 DispatchQueues.

使 属性 线程安全
class MyObject {
    private var internalState: Int
    private let internalQueue: DispatchQueue // Serial or Concurrent?

    var state: Int {
        get {
            return internalQueue.sync { internalState }
        }

        set (newState) {
            internalQueue.sync { internalState = newState }
        }
    }
}

他们使用 DispatchQueue 来锁定 属性。但我认为这个片段是无效的,因为 internalQueue 可能是并发的。因此,如果我们从两个不同的 DispatchQueues/Threads 调用 setter 如果该内部队列不是串行的,它也可能导致线程问题,对吗?因为在我的理解中,同步只是保持调用线程并在任务完成时继续。你觉得这个片段怎么样?我错了吗?

But i think this snippet is not valid, because the internalQueue could be concurrent

但不是并发的。您创建的调度队列默认是串行的。这就是技术(和示例)的重点。

我只想展示另一种方法,它使您能够并发读取,但通过使用调度屏障在写入时阻止所有内容。

class MyObject {
private var internalState: Int
private let internalQueue = DispatchQueue(label: "reader-writer", attributes: .concurrent)

var state: Int {
    get {
        return internalQueue.sync { internalState }
    }

    set (newState) {
        internalQueue.async(flags: .barrier) { internalState = newState }
    }
  }
}

使用这种方法,读取可以在队列上并发发生,但由于屏障的原因,写入是独占执行的。

这只是 Swift 3 本书 Effective Objective C 2.0 中解释的一种方法的转换,作者是 Matt Galloway。