线程锁- @synchronized

@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秒钟时间内, 并没有线程访问成员变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值