ios – @synchronized是否保证线程安全?

ios – @synchronized是否保证线程安全?,第1张

概述参考这 answer,我想知道这是正确的吗? @synchronized does not make any code “thread-safe” 因为我试图找到任何文档或链接来支持这个声明,没有成功。 任何意见和/或答案将在此赞赏。 为了更好的线程安全,我们可以去其他工具,这是我知道的。 @synchronized使代码线程安全,如果它正确使用。 例如: 让我说我有一个类访问非线程安全的数据库。 参考这 answer,我想知道这是正确的吗?

@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是否保证线程安全?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1042550.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存