一块资源可能会被多个线程共享,也就是说多个线程可能会访问同一块资源。
比如多个线程同时操作同一个对象,同一个变量。
当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题。
比如一个买票问题:
#import "ViewController.h"
@interface ViewController()@property(assign, nonatomic) NSInteger maxCount;@end
@implementation ViewController
- (void) viewDidLoad { [super viewDidLoad];
_maxCount = 20;
// 线程1
[NSThread detachNewThreadSelector: @selector(run) toTarget: self withObject: nil];
// 线程2
[NSThread detachNewThreadSelector: @selector(run) toTarget: self withObject: nil];
}
- (void) run {
while (1) {
if (_maxCount > 0) {
// 暂停一段时间
[NSThread sleepForTimeInterval: 0.002];
_maxCount--;
NSLog(@"卖了一张票 - %ld - %@", _maxCount, [NSThread currentThread]);
} else {
NSLog(@"票卖完了");
break;
}
}
}
输出结果:
可以看到,当多个线程同时访问同一个数据的时候,很容易出现数据错乱,资源争夺的现象。
互斥锁,使用的是线程同步的技术。加锁的代码需要尽量少,这个锁
来源: http://www.cnblogs.com/chenjiangxiaoyu/p/8027046.html