1.在多线程的情况下,使用锁变得非常重要,一旦一个线程获得锁,其他线程一定等待.
@synchronized互斥锁:只能加锁Objective-C对象,会隐式地添加异常处理代码,也就是当发生异常时会
自动释放互斥锁,所以会有一定的性能损耗
dispatch_async(dispatch_get_global_queue(0,0), ^{
@synchronized(_myLockObj){ 给对象加锁,防止多线程同时访问。
}};
2.
NSLock互斥锁: NSLock类使用的是POSIX线程来实现它的锁操作,而且需要注意的是必须在同一 线程内发送unlock消息,否则会发生不确定的情况。 NSLock不能被用来实现迭代锁,因为 如果发生lock消息两次的话,整个线程将被永久锁住
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[lock lock];
NSLog(@"123496978");
[lock unlock];
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[lock lock];
NSLog(@"uweujejwdjje");
[lock unlock];
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[lock lock];
NSLog(@"123");
[lock unlock];
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[lock lock];
NSLog(@"uweu");
[lock unlock];
}); //执行完和串行效果一样,依次执行
3
//NSConditionLock条件锁:可以设置其条件,下一个线程条件设置(10)相同或者不设置条件线程也会执行。
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[conditionlock lockWhenCondition:10];
NSLog(@"123496978");
[conditionlock unlock];
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[conditionlock lock];
NSLog(@"uweujejwdjje");
[conditionlock unlockWithCondition:10];
});
4.
NSCondition锁: 一个线程在等待信号而阻塞时,可以被另外一个线程唤醒,是互斥锁和条件锁的结合体
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[condition lock];
NSLog(@"123496978");
[condition unlock];
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[condition lock];
NSLog(@"uweujejwdjje");
[condition unlock];
});