@synchronized 指令

@synchronized 指令能够方便的在oc代码中建立互斥锁。这个指令和其余的互斥锁作的同样,防止同一时间不一样的线程获取同一个互斥锁。在这种状况下,你没必要建立互斥或锁对象,相反,你只须要使用一个oc对象做为锁的token,以下所示:html

- (void)myMethod:(id)anObj
{
    @synchronized(anObj)
    {
        // Everything between the braces is protected by the @synchronized directive.
    }
}

传递给@synchronized的对象是做为区分保护块的一个特别的标识。若是你在两个不一样的线程中执行上面的方法,每一个线程传递不一样的对象做为anObj参数,每一个都会被锁定并继续处理而不会被另外的一个阻塞。若是在这两个线程中传递的是同一个对象,其中一个线程会首先获取锁,另一个线程被阻塞直到第一个线程的关键段完成。ios

做为预防措施,@synchronized块隐式地将一个异常处理程序添加到受保护的代码。这个处理程序自动释放互斥锁时,就会抛出一个异常。这意味着为了使用@synchronized指令,您必须启用Objective-C代码中的异常处理。若是你不但愿因为隐式的异常处理形成额外的开销,您应该考虑使用lock类。关于@ synchronized指令的更多信息,请参见 The Objective-C Programming Language.app

官方文档测试

启用oc异常(关闭试了下,编译运行都没问题,待跟踪)
spa

 

 

 

 

 

注:经代码测试,对于可变对象,若是地址不变的话,仍是互斥的。.net

相关文章
相关标签/搜索