使用@synchronized指令

本文详细介绍了 Objective-C 中用于创建互斥锁的 @synchronized 指令,包括其工作原理、如何使用以及注意事项。通过示例展示了如何使用 @synchronized 来保护代码块,避免多线程冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用@synchronized指令

@synchronized 指令是在 Objective-C 代码中创建一个互斥锁非常方便的方法。@synchronized 指令做和其他互斥锁一样的工作(它防止不同的线程在同一时间获取同一个锁)。然而在这种情况下,你不需要直接创建一个互斥锁或锁对象。相反,你只需要简单的使用 Objective-C 对象作为锁的令牌,如下面例子所示:

page73image35168page73image35648page73image35808page73image35968
- (void)myMethod:(id)anObj
page73image38048page73image38208page73image38368

{

page73image40760page73image40920page73image41080
@synchronized(anObj)
page73image42960page73image43120page73image43280

{

page73image45512page73image45672page73image45832
// Everything between the braces is protected by the @synchronized directive.
page73image48272page73image48432page73image48592

}

page73image51240page73image51400page73image51560

}

创建给@synchronized 指令的对象是一个用来区别保护块的唯一标示符。如果你在两个不同的线程里面执行上述方法,每次在一个线程传递了一个不同的对象给anObj 参数,那么每次都将会拥有它的锁,并持续处理,中间不被其他线程阻塞。然而,如果你传递的是同一个对象,那么多个线程中的一个线程会首先获得该锁,而其他线程将会被阻塞直到第一个线程完成它的临界区。作为一种预防措施,@synchronized 块隐式的添加一个异常处理例程来保护代码。

该处理例程会在异常抛出的时候自动的释放互斥锁。这意味着为了使用@synchronized 指令,你必须在你的代码中启用异常处理。了如果你不想让隐式的异常处理例程带来额外的开销,你应该考虑使用锁的类。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值