OC
NSObject *obj = [[NSObject alloc] init];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
@synchronized (obj) {
NSLog(@"線程同步的操作1 開始");
sleep(3);
NSLog(@"線程同步的操作1 結(jié)束");
}
});
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 結(jié)束")
objc_sync_exit(obj)
}
DispatchQueue.global().async {
sleep(1)
objc_sync_enter(obj)
print("線程同步的操作2")
objc_sync_exit(obj)
}
上面結(jié)果的執(zhí)行結(jié)果為:
線程同步的操作1 開始
線程同步的操作1 結(jié)束
線程同步的操作2
@synchronized(obj)
指令使用的 obj
為該鎖的唯一標(biāo)識推溃,只有當(dāng)標(biāo)識相同時昂利,才為滿足互斥,如果線程2中的 @synchronized(obj)
改為 @synchronized(self)
铁坎,剛線程2就不會被阻塞蜂奸,@synchronized
指令實現(xiàn)鎖的優(yōu)點就是我們不需要在代碼中顯式的創(chuàng)建鎖對象,便可以實現(xiàn)鎖的機制硬萍,但作為一種預(yù)防措施扩所,@synchronized
塊會隱式的添加一個異常處理例程來保護代碼,該處理例程會在異常拋出的時候自動的釋放互斥鎖朴乖。所以如果不想讓隱式的異常處理例程帶來額外的開銷祖屏,你可以考慮使用鎖對象。