拥有同步线程的目的

时间:2018-11-12 06:18:51

标签: ios swift thread-safety singleton

下面的代码应该建立一个线程安全的单例:

class Singleton {
    static var shared = Singleton()
    private let internalQueue = DispatchQueue(label: "SingletionInternalQueue", qos: .default, attributes: .concurrent)

    private var _foo: String = "aaa"

    var foo: String {
        get {
            return internalQueue.sync { _foo }
        }
        set (newState) {
            internalQueue.async(flags: .barrier) { self._foo = newState }
        }
    }

    func setup(string: String) {
        foo = string
    }
}

来源:Thread safe singleton in swift

但是我不明白这个目的。

例如,如果我希望get的值为foo,我是否应该只能读取它?该操作应始终在主线程上执行,那么添加另一个线程有什么意义呢?

set类似:如果我担心多个源同时设置该值,我们是否可以简化该代码并消除.barrier参数?

internalQueue.async(flags: .barrier) { self._foo = newState}

如果它在sync块中,这不是将其强制到主线程上吗?如果是这样,那为什么不只需要将代码self._foo = newState

1 个答案:

答案 0 :(得分:0)

您是正确的:只要您仅从主线程访问单例,就不需要同步。在这种情况下,我宁愿使用如下代码来明确要求:

assert(Thread.isMainThread)

这将在生产版本中进行优化,但是将确保您在调试模式下(例如,当您从URLSession完成处理程序调用代码时)发现无意的编程错误。