线程安全问题
1,单线程情况下,任务依次执行不会出现线程安全的问题;
2,单线程情况下,多线程都是访问共享资源,而不是修改资源也可以保证线程安全,如:只读的全局属性;
3,线程不安全是由于多线程访问造成的,多线程访问和修改共享资源引起了不可预测的结果;
线程锁
线程锁可以有效的解决多线程引起的安全问题.
iOS多线程开发为保证线程安全而使用了好几种锁:
1 | NSLock、dispatch_semaphore、NSCondition |
NSLock
1 | _lock = [[NSLock alloc]init];//创建 |
@synchronized
一个对象层面的锁,锁住整个对象,底层使用了互斥递归锁来实现;
常用在单例的创建
1 | +(Common *)sharedInstance{ |
模拟场景:
火车站某趟列车的票数销售.
说明:总票数固定,会出现同时在销售的情况,但是销售的余额票数不能构成混乱;
NSLock为例
不使用线程锁
1 | dispatch_queue_t q1 = dispatch_queue_create("q1", DISPATCH_QUEUE_CONCURRENT); |
使用线程锁:
1 | dispatch_queue_t q1 = dispatch_queue_create("q1", DISPATCH_QUEUE_CONCURRENT); |