A、dispatch_semaphore信号量:
如果初始化的时候信号量为0,并且执行任务的过程中,没有发送信号,那么wait之后的任务全部不能执行。
B、dispatch_barrier_async栅栏:
会造成短暂的阻塞线程,实际上并不能算作真正的阻塞。
C、dispatch_group_wait线程等待:
在等待前面的任务执行的过程中,后面的任务全部停止,在这个等待的过程中,也等同于短暂的阻塞线程。
D、串行主队列
E、同步线程执行同步串行队列
F、异步线程执行同步串行队列
D、E、F会直接造成死锁,因为同步串行队列,只能一个一个任务的执行。不管是在新的同步线程里还是异步线程里执行都会造成相互等待,并且是永久的等待,所以直接死。
- 加锁解锁方式
1、信号量
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
//加锁
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//解锁
dispatch_semaphore_signal(semaphore);
2、NSLock
NSLock *myLock;
//加锁
[myLock lock];
//解锁
[myLock unlock];
3、synchronized互斥锁
@synchronized (self) {
/*你的操作*/
}
网友评论