@synchronized
@synchronized关键字构建的锁
使用@synchronized解决线程同步问题相比较NSLock要简单一些,日常开发中也更推荐使用此方法。首先选择一个对象作为同步对象(一般使用self),然后将”加锁代码”(争夺资源的读取、修改代码)放到代码块中。@synchronized中的代码执行时先检查同步对象是否被另一个线程占用,如果占用该线程就会处于等待状态,直到同步对象被释放。
@synchronized指令使用的obj为该锁的唯一标识,只有当标识相同时,才为满足互斥,如果线程2中的@synchronized(obj)改为@synchronized(other),刚线程2就不会被阻塞,@synchronized指令实现锁的优点就是我们不需要在代码中显式的创建锁对象,便可以实现锁的机制,但作为一种预防措施,@synchronized块会隐式的添加一个异常处理例程来保护代码,该处理例程会在异常抛出的时候自动的释放互斥锁。所以如果不想让隐式的异常处理例程带来额外的开销,你可以考虑使用锁对象。
@synchronized的使用
- (void)thread6 {
for (int i = 0; i < 3; i ++) {
@synchronized(self) {
_sum ++;
NSLog(@"线程6:sum:%i", _sum);
sleep(1);
}
}
}
2016-11-05 18:45:31.441 Multithreading[17081:537982] 线程7:sum:2
2016-11-05 18:45:31.441 Multithreading[17081:537981] 线程6:sum:1
2016-11-05 18:45:31.441 Multithreading[17081:537982] 线程7:sum:3
2016-11-05 18:45:31.441 Multithreading[17081:537982] 线程7:sum:4
2016-11-05 18:45:32.513 Multithreading[17081:537981] 线程6:sum:5
可以看见在等待的1秒钟时间内, 并没有线程访问成员变量