是否在setter-getter中同步类属性以提高线程安全性?

时间:2019-02-20 09:30:37

标签: performance thread-safety grand-central-dispatch synchronisation ios-multithreading

我在类属性中有比赛条件。一个线程正在读取,另一个线程正在写入。现在,我想出了一个解决方案,用于同步该属性的getter和setter。问题是,这会影响应用程序的性能吗?如果是,除了同步属性外,还有其他解决方法吗?

1 个答案:

答案 0 :(得分:0)

同步总是会对性能产生影响,但是影响的多少完全取决于具体情况-例如与getter相比,setter调用的频率是多少,与getter相比,setter调用的速度如何,等等。

在Swift中,您可以使用带有DispatchQueue标志的.barrier来实现readers-writer lock

class MyClass {
    private static let queue = DispatchQueue(
        label: "synchronisation",
        qos: .userInitiated, // use QoS that match your current use-case
        attributes: [.concurrent]
    )
    private static var _field = ""
    public static var field: String {
        get {
            return queue.sync {
                return self._field
            }
        }
        set {
            return queue.sync(flags: .barrier) {
                self._field = newValue
            }
        }
    }
}

另一方面,同步是正确处理对同一“资源”的并发访问的唯一方法。