多线程 线程同步问题

mac2022-06-30  23

//  DYFViewController.m //  623-05-线程同步问题 // //  Created by dyf on 14-6-23. //  Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. //   #import "DYFViewController.h"   @interface DYFViewController () @property ( nonatomic , assign) int leftCount;   @property ( nonatomic , strong) NSThread *thread0; @property ( nonatomic , strong) NSThread *thread1; @property ( nonatomic , strong) NSThread *thread2;   @end   @implementation DYFViewController   - ( void )viewDidLoad {      [ super viewDidLoad];      // Do any additional setup after loading the view, typically from a nib.            // 默认有100张      self .leftCount = 100;      // 开启多条线程同时卖票      self .thread0 = [[ NSThread alloc] initWithTarget: self selector: @selector (saleTicket) object:@ "000" ];      self .thread0.name = @ "0000" ;      // 优先级      self .thread0.threadPriority = 1.0;            self .thread1 = [[ NSThread alloc] initWithTarget: self selector: @selector (saleTicket) object:@ "000" ];      self .thread1.name = @ "1111" ;      self .thread1.threadPriority = 0.0;            self .thread2 = [[ NSThread alloc] initWithTarget: self selector: @selector (saleTicket) object:@ "000" ];      self .thread2.name = @ "2222" ;      self .thread2.threadPriority = 0.0;             }   /**   *  卖票   */ - ( void )saleTicket { //    NSLock *lock = [[NSLock alloc] init]; //    lock.tryLock //    lock.lock            while (1) {                @synchronized ( self ){ // 开始枷锁                    // 1.先检查票数          int count = [ self leftCount];          if (count > 0) {              // 票数 - 1              [ self setLeftCount:(count - 1)];              // 暂停              [ NSThread sleepForTimeInterval:0.0004];              NSThread *currentT = [ NSThread currentThread];              NSLog (@ "%@,-------%d" , currentT.name, self .leftCount);          } else          {              // 退出线程              [ NSThread exit];          }          } // 解锁      } }   - ( void )touchesBegan:( NSSet *)touches withEvent:(UIEvent *)event {      [ self .thread0 start];      [ self .thread1 start];      [ self .thread2 start]; }   @end

 小结:

--------------线程的安全问题(多线程的安全隐患)-------

1.资源共享

·一块资源可能会被多个线程共享,即多个线程可能会访问同一块资源

·比如多个线程访问同一个对象,同一个变量、同一个文件

 

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

 

3.实例

eg。1 存钱取钱

eg。2 卖票

 

-----------------安全隐患解决-互斥锁-----

1.格式

@synchronized(锁对象)

{// 需要锁定的代码

}

注意:锁定一份代码只能用1把锁,用多把锁是无效的

2.优缺点

·优点:能有效防止多线程抢夺资源造成的安全问题

·缺点:需要消耗大量的cpu资源

 

3.互斥锁的使用前提:多条线程抢夺同一块资源

 

4.相关术语:线程同步

·means:多条线程按顺序的执行任务

·互斥锁就是使用了线程同步技术

   

转载于:https://www.cnblogs.com/Cheetah-yang/p/4664146.html

最新回复(0)