拥有同步线程的目的

pro*_*ner 5 singleton thread-safety ios swift

下面的代码据说可以设置一个线程安全的单例:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

来源:swift中的线程安全单例

但我不明白这个目的.

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

与此类似set:如果我担心同时设置值的多个源,我们不能简化该代码并消除.barrier参数吗?

internalQueue.async(flags: .barrier) { self._foo = newState}
Run Code Online (Sandbox Code Playgroud)

如果它在一个sync块中,是不是强制它进入主线程?如果是这样,那为什么代码不需要self._foo = newState呢?

her*_*rzi 0

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

assert(Thread.isMainThread)

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