假设您尝试myID
在后台队列中同步与此对象的交互,您希望它反过来,即调度块内的锁。现在你有:
@synchronized(myID) {
dispatch_async(queue, ^{
// do stuff with myID
});
}
这是同步将调度块添加到队列的过程,但不会同步您在后台执行的操作。我怀疑这不是你的意思。
您可能打算:
dispatch_async(queue, ^{
@synchronized(myID) {
// do stuff with myID
}
});
它看起来非常相似,但会导致完全不同的行为。现在,分派到后台队列的工作正在同步。
作为进一步的改进,如果这个分派的块可能很慢(我假设它可能是),那么您可能希望尽可能地限制该@synchronized
块:
dispatch_async(queue, ^{
// do slow stuff in preparation for interacting with `myID`
@synchronized(myID) {
// quickly do stuff with myID
}
// do anything else here
});
如果您在一个块中执行所有后台块@synchronized
,您可能会破坏将其分派到后台的整个目的,即最小化对主队列的影响。最后一个版本缓解了这个问题。
作为最后的观察,如果你有一个串行队列(或一个非全局并发队列,你在其中使用屏障进行更新),这通常被用作一种完全不需要锁的技术,只要所有更新和查询formyID
被分派到该队列。请参阅并发编程指南中的消除基于锁的代码。