@synchronized 指令
2016-05-26 00:00
190 查看
摘要: 翻译自官网
@synchronized 指令可以方便的在oc代码中创建互斥锁。这个指令和其他的互斥锁做的一样,防止同一时间不同的线程获取同一个互斥锁。在这种情况下,你不必创建互斥或锁对象,相反,你只需要使用一个oc对象作为锁的token,如下所示:
传递给@synchronized的对象是作为区分保护块的一个特别的标识。如果你在两个不同的线程中执行上面的方法,每个线程传递不同的对象作为anObj参数,每个都会被锁定并继续处理而不会被另外的一个阻塞。如果在这两个线程中传递的是同一个对象,其中一个线程会首先获取锁,另外一个线程被阻塞直到第一个线程的关键段完成。
作为预防措施,@synchronized块隐式地将一个异常处理程序添加到受保护的代码。这个处理程序自动释放互斥锁时,就会抛出一个异常。这意味着为了使用@synchronized指令,您必须启用Objective-C代码中的异常处理。如果你不希望由于隐式的异常处理造成额外的开销,您应该考虑使用lock类。关于@ synchronized指令的更多信息,请参见 The Objective-C Programming Language.
官方文档
启用oc异常(关闭试了下,编译运行都没问题,待跟踪)
注:经代码测试,对于可变对象,如果地址不变的话,还是互斥的。
@synchronized 指令可以方便的在oc代码中创建互斥锁。这个指令和其他的互斥锁做的一样,防止同一时间不同的线程获取同一个互斥锁。在这种情况下,你不必创建互斥或锁对象,相反,你只需要使用一个oc对象作为锁的token,如下所示:
[code=language-objectivec]- (void)myMethod:(id)anObj { @synchronized(anObj) { // Everything between the braces is protected by the @synchronized directive. } }
传递给@synchronized的对象是作为区分保护块的一个特别的标识。如果你在两个不同的线程中执行上面的方法,每个线程传递不同的对象作为anObj参数,每个都会被锁定并继续处理而不会被另外的一个阻塞。如果在这两个线程中传递的是同一个对象,其中一个线程会首先获取锁,另外一个线程被阻塞直到第一个线程的关键段完成。
作为预防措施,@synchronized块隐式地将一个异常处理程序添加到受保护的代码。这个处理程序自动释放互斥锁时,就会抛出一个异常。这意味着为了使用@synchronized指令,您必须启用Objective-C代码中的异常处理。如果你不希望由于隐式的异常处理造成额外的开销,您应该考虑使用lock类。关于@ synchronized指令的更多信息,请参见 The Objective-C Programming Language.
官方文档
启用oc异常(关闭试了下,编译运行都没问题,待跟踪)
注:经代码测试,对于可变对象,如果地址不变的话,还是互斥的。
相关文章推荐
- js 数组的push 方法和 join方法
- 一个开源系统的架构分析
- 一个开源系统的架构分析(二)
- 取消CentOS 的图形界面 开机直接进入命令行模式
- MonkeyRunner入门
- ADB shell
- LR12通过ODBC连接Mysql数据库
- LR12 DataWizard从Mysql数据取参数化数据
- 抽象工厂
- vs2010中git配置
- iOS 知识-常用小技巧大杂烩
- BeanFactory和FactoryBean
- 一致性Hash算法
- 关于C10K、异步回调、协程、同步阻塞
- 5种最流行的IO策略
- SQLite第三方框架FMDB的使用,以及使用FMDatabaseQueue保证线程安全
- C#虚方法的重写
- crytek在github上开源了CRYENGINE得代码
- 多平台原生B4X开发学习日志-第4天
- 小短文,也谈iOS项目架构