我被要求在 swift 中实现一个线程安全的字典,我使用了常见的方法:
class MutableDictionary {
var dictionary: [String : Any] = [:]
var queue = DispatchQueue(label: "queue", attributes: .concurrent)
func object(for key: String) -> Any? {
queue.sync {
return dictionary[key]
}
}
func set(_ object: Any?, for key: String) {
queue.async(flags: .barrier) {
self.dictionary[key] = object
}
}
}
但是,接下来的问题是:
concurrent
+ barrier
与仅使用 serialQueue
进行设置有什么区别?最佳答案
1、使用barrier
,并发队列暂时可以一次执行一个任务。
但是,serialQueue 一次只能执行一项任务。
2、假设你只用队列来读/写,显然它们的效果是一样的。如果你将另一种任务交给它,显然并发队列的成本更低,这才是真正的区别。
3、提交给async对象的地址会在你的对象是类的时候定义。当你给类成员一个新值时,你将有一个错误的地址,所以你无法访问它并且错误来了。 您可以通过结构尝试 .
4、引用答案1
。
5、有时候希望任务执行得更快,concurrentQueue优先。如果你想有序地执行任务,serialQueue 做的更好。
https://stackoverflow.com/questions/71850309/