Swift-惰性var线程安全吗?
也许这个问题需要一些上下文。
我一直在使用Core Data在持久层上进行工作,发现Core
Data不是线程安全的,因此仅需要NSManagedObjectContext
限制在每个线程中。
因此,我的方法是创建自定义后台线程NSManagedObjectContext
,以执行获取,保存等操作,同时还要创建主线程NSManagedObjectContext
,该线程将用于NSManagedObject
从获取的线程中获取NSManagedObjectId
并将其传递给调用者方法。
默认情况下,Xcode的生成与核心数据模板的代码中使用lazy
var的所有NSManagedObjectContext
,NSManagedObjectModel
等等。
所以我的问题是是否
使用lazy var
实例化方法来创建NSManagedObjectContext
,前提是lazy
var为每个尝试访问的线程初始化一个对象(不是线程安全的吗?)
要么
NSManagedObjectContext
在每个线程中声明单独的变量,并使所有与线程相关的方法引用两个不同的变量NSManagedObjectContext
,它们lazy
var是线程安全的(?),并且在访问该线程时与线程无关仅创建一次。
先感谢您!
编辑:任何在Core Data并发问题上苦苦挣扎的人,本文都会列出一个非常好的设计模式,正如Aaron在下面的评论中指出的那样!
回答:
从Swift编程语言:属性:
如果
lazy
多个线程同时访问带有修饰符的属性,并且该属性尚未初始化,则不能保证该属性仅被初始化一次。
lazy var
不是线程安全的。您可以使用
dispatch_once
(在应用的整个生命周期内运行一次)- 常数(
let
) - 嵌套的struct模式(通常用于单例)
为了线程安全。
您还可以使用使用自己的锁定,NSRecursiveLock
但是效率可能不如dispatch_once
。
以上是 Swift-惰性var线程安全吗? 的全部内容, 来源链接: utcz.com/qa/418764.html