@synchronized 指令

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

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

 

 

 

 

 

注:经代码测试,对于可变对象,如果地址不变的话,还是互斥的。

 

 

 

转载于:https://my.oschina.net/petsatan/blog/682131

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值