我是否应该在应用程序委托中创建一个NSLock实例,以供所有类使用?或者,让每个类根据需要实例化自己的NSLock实例是否可取?
例如,如果我可以访问分布在两个视图控制器上的托管对象上下文,那么在第二种情况下锁定会起作用吗?
发布于 2009-10-18 10:30:21
如果多个对象访问您的对象只是为了读取其内容,那么您根本不需要锁。如果至少有一个对象访问您的对象以写入/更新其内容,那么其他对象是否访问您的对象以读取或写入/更新它并不重要:在这种情况下,您需要一个锁。
现在,为了正确地保护您的对象(在代码的关键部分中,多个对象可以访问它),您必须使用相同的锁实例,然后访问您愿意保护的对象的所有可能的对象必须共享该锁实例。
如果您的应用程序需要保护一个可以被大多数类同时访问的对象,那么使用单个锁实例就可以了。如果您想要更好的性能(特别是在同时访问对象的次数很多的情况下),那么可以使用多个锁。每个锁将负责允许/拒绝对对象的特定属性/字段的访问。这样,几个对象可以同时更改不同的属性/字段来访问您的对象。您基本上是在递增对象上的并发操作的数量。但是,每个锁仍然必须在将访问您正在保护的对象的其他对象之间共享。
每个控制器都有一个锁实例是行不通的;这不会保护您的对象不受不同线程中其他对象的并发访问。NSLock是使用POSIX pthread互斥锁实现的,因此必须以完全相同的方式使用它。NSLock文档中也清楚地说明了这一点:
警告: NSLock类使用POSIX线程来实现其锁定行为。向NSLock对象发送解锁消息时,必须确保该消息是从发送初始锁定消息的同一线程发送的。从其他线程解锁可能会导致未定义的行为。
因此,为了保留临界区语义,获取锁的同一线程负责在完成时释放锁。另请注意,锁定机制仅用于快速操作,即在释放锁之前,您应该只获得一小段时间的锁。如果您需要等待一段不可预测的时间,那么您需要一种不同的同步机制,即可通过NSCondition类获得的条件变量。
希望这能有所帮助。
发布于 2010-01-18 06:32:36
您不应该对核心数据使用锁。该文档可能已过时。理想情况下,每个线程应该有一个上下文,并让上下文处理其底层NSPersistentStoreCoordinator的锁定。这被认为是目前在多线程应用程序中使用核心数据的唯一安全方法。
https://stackoverflow.com/questions/1582574
复制相似问题