@synchronized does not make any code “thread-safe”
因为我试图找到任何文档或链接来支持这个声明,没有成功。
任何意见和/或答案将在此赞赏。
为了更好的线程安全,我们可以去其他工具,这是我知道的。
解决方法 @synchronized使代码线程安全,如果它正确使用。例如:
让我说我有一个类访问非线程安全的数据库。我不想同时读写数据库,因为这可能会导致崩溃。
所以让我们说我有两个方法。 storeData:和readData在一个名为LocalStore的单例类上。
- (voID)storeData:(NSData *)data { [self writeDataTodisk:data]; } - (NSData *)readData { return [self readDataFromdisk]; }
现在如果我将这些方法分派到自己的线程上,像这样:
dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAulT,0),^{ [[LocalStore sharedStore] storeData:data]; }); dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAulT,^{ [[LocalStore sharedStore] readData]; });
很可能我们会崩溃。但是,如果我们将storeData和readData方法更改为使用@synchronized
- (voID)storeData:(NSData *)data { @synchronized(self) { [self writeDataTodisk:data]; } } - (NSData *)readData { @synchronized(self) { return [self readDataFromdisk]; } }
现在这个代码将是线程安全的。重要的是要注意,如果我删除一个@synchronized语句,然而代码将不再是线程安全。或者如果我要同步不同的对象而不是自我。
@synchronized在要同步的对象上创建互斥锁。所以换句话说,如果任何代码想访问一个@synchronized(self){}块中的代码,它必须在同一个块内运行的所有以前的代码后面。
如果我们要创建不同的localStore对象,@synchronized(self)将只锁定每个对象单独。那有意义吗?
想想它这样。你有一大群人在不同的线路等待,每行编号为1-10。你可以选择你希望每个人等待的行(通过每行同步),或者如果不使用@synchronized,你可以直接跳到前面,跳过所有的行。第1行中的人不必等待第2行中的人完成,但是第1行中的人不得不等待他们前面的每个人都完成。
总结以上是内存溢出为你收集整理的ios – @synchronized是否保证线程安全?全部内容,希望文章能够帮你解决ios – @synchronized是否保证线程安全?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)