您的位置:首页 > 其它

@synchronized 指令

2016-05-26 00:00 190 查看
摘要: 翻译自官网

@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异常(关闭试了下,编译运行都没问题,待跟踪)



注:经代码测试,对于可变对象,如果地址不变的话,还是互斥的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: