多线程的安全隐患

一块资源可能会被多个线程共享,也就是说多个线程可能会访问同一块资源。

比如多个线程同时操作同一个对象,同一个变量。

当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题。

比如一个买票问题:

#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; } } }

 输出结果:

可以看到,当多个线程同时访问同一个数据的时候,很容易出现数据错乱,资源争夺的现象。

1. @synchronized(锁对象) { // 需要锁定的代码  } 来解决

互斥锁,使用的是线程同步的技术。加锁的代码需要尽量少,这个锁

版权声明:本文为chenjiangxiaoyu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.cnblogs.com/chenjiangxiaoyu/p/8027046.html