在 setter - getter 中同步 class 属性 是否会影响线程安全性?
Does synchronising a class property in setter - getter for thread safety impact performance?
我在 class 属性 中有竞争条件。一个线程正在阅读它,另一个线程正在写作。现在我想出了一个同步 getter 和 setter 的 属性 的解决方案。问题是这会影响应用程序的性能吗?如果是,除了同步 属性 之外还有其他解决方案吗?
同步总是会对性能产生影响,但影响的大小完全取决于具体情况 - 例如与 getter 相比,setter 调用的频率有多高,与 getter 相比,setter 的调用速度有多快,等等
在 Swift 中,您可以使用带有 .barrier
标志的 DispatchQueue
来实现 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
}
}
}
}
另一方面,同步是正确处理对同一 "resource".
的并发访问的唯一方法
我在 class 属性 中有竞争条件。一个线程正在阅读它,另一个线程正在写作。现在我想出了一个同步 getter 和 setter 的 属性 的解决方案。问题是这会影响应用程序的性能吗?如果是,除了同步 属性 之外还有其他解决方案吗?
同步总是会对性能产生影响,但影响的大小完全取决于具体情况 - 例如与 getter 相比,setter 调用的频率有多高,与 getter 相比,setter 的调用速度有多快,等等
在 Swift 中,您可以使用带有 .barrier
标志的 DispatchQueue
来实现 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
}
}
}
}
另一方面,同步是正确处理对同一 "resource".
的并发访问的唯一方法