OC
NSObject *obj = [[NSObject alloc] init];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
@synchronized (obj) {
NSLog(@"线程同步的操作1 开始");
sleep(3);
NSLog(@"线程同步的操作1 结束");
}
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(1);
@synchronized (obj) {
NSLog(@"线程同步的操作2");
}
});
Swift
let obj = NSObject()
DispatchQueue.global().async {
objc_sync_enter(obj)
print("线程同步的操作1 开始")
sleep(3)
print("线程同步的操作1 结束")
objc_sync_exit(obj)
}
DispatchQueue.global().async {
sleep(1)
objc_sync_enter(obj)
print("线程同步的操作2")
objc_sync_exit(obj)
}
上面结果的执行结果为:
线程同步的操作1 开始
线程同步的操作1 结束
线程同步的操作2
@synchronized(obj)
指令使用的 obj
为该锁的唯一标识,只有当标识相同时,才为满足互斥,如果线程2中的 @synchronized(obj)
改为 @synchronized(self)
,刚线程2就不会被阻塞,@synchronized
指令实现锁的优点就是我们不需要在代码中显式的创建锁对象,便可以实现锁的机制,但作为一种预防措施,@synchronized
块会隐式的添加一个异常处理例程来保护代码,该处理例程会在异常抛出的时候自动的释放互斥锁。所以如果不想让隐式的异常处理例程带来额外的开销,你可以考虑使用锁对象。