网络开始---多线程---线程的安全问题(了解)(四)

  1 //
  2 /**
  3  *  线程的注意点
  4  1.不要同时开太多线程,(1-3条即可,最多不要超过5条)
  5
  6  线程概念:
  7  1.主线程: UI线程,显示、刷新UI界面、处理UI控件的事件
  8  2.子线程(异步线程、后台线程)
  9
 10  3.不要把耗时的操作放在主线程,要放在子线程中执行
 11
 12
 13  这里是3个窗口卖票的案例
 14  */
 15
 16 #import "HMViewController.h"
 17
 18 @interface HMViewController ()
 19 //3个窗口3条线程
 20 @property (nonatomic, strong) NSThread *thread1;
 21 @property (nonatomic, strong) NSThread *thread2;
 22 @property (nonatomic, strong) NSThread *thread3;
 23
 24 /**
 25  *  剩余票数
 26  */
 27 @property (nonatomic, assign) int leftTicketCount;
 28
 29
 30 //锁对象,用一把锁,不要经常换锁,才能保证线程的安全
 31 //@property (nonatomic, strong) NSObject *locker;
 32 @end
 33
 34 @implementation HMViewController
 35
 36 - (void)viewDidLoad
 37 {
 38     [super viewDidLoad];
 39
 40     //开始剩余的票数为50张
 41     self.leftTicketCount = 50;
 42
 43     //创建线程
 44     self.thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
 45     //线程名称
 46     self.thread1.name = @"1号窗口";
 47
 48     self.thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
 49     self.thread2.name = @"2号窗口";
 50
 51     self.thread3 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
 52     self.thread3.name = @"3号窗口";
 53
 54 //    self.locker = [[NSObject alloc] init];
 55 }
 56
 57 //点击启动线程  3个窗口同时开始卖票,
 58 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 59 {
 60     [self.thread1 start];
 61     [self.thread2 start];
 62     [self.thread3 start];
 63 }
 64
 65 /**
 66  *  卖票
 67  */
 68 - (void)saleTicket
 69 {
 70     while (1) {  //写个死循环一直卖,卖光为止
 71
 72         // ()小括号里面放的是锁对象  括号里面用self就行了,标示唯一的一把锁
 73
 74         @synchronized(self) {// 开始加锁  叫做互斥锁
 75
 76             //保证一个线程访问资源时其他线程不能访问该资源,只要使用@synchronized这个关键字即可枷锁,保证线程的安全
 77
 78             //多条线程抢夺同一块资源时才需要加锁,要不然非常耗费CPU资源
 79             //线程同步:按顺序的执行任务,线程同步问题就 加锁 解决问题
 80             //互斥锁就是使用了线程同步技术
 81
 82             //取出剩余的票数
 83             int count = self.leftTicketCount;
 84             //如果票数大于0
 85             if (count > 0) {
 86                 [NSThread sleepForTimeInterval:0.05];
 87
 88                 //剩余的票数-1
 89                 self.leftTicketCount = count - 1;
 90
 91                 NSLog(@"%@卖了一张票, 剩余%d张票", [NSThread currentThread].name, self.leftTicketCount);
 92             } else {  //如果票数为0,退出循环
 93
 94                 return; // 退出循环
 95
 96             }
 97         } // 解锁
 98     }
 99 }
100
101 @end
时间: 2024-10-13 22:43:54

网络开始---多线程---线程的安全问题(了解)(四)的相关文章

网络开始---多线程---线程间的通信(掌握)(五)

1 #import "HMViewController.h" 2 3 @interface HMViewController () 4 @property (weak, nonatomic) IBOutlet UIImageView *imageView; 5 @end 6 7 @implementation HMViewController 8 9 - (void)viewDidLoad 10 { 11 [super viewDidLoad]; 12 // Do any additi

JAVA-初步认识-第十三章-多线程(线程安全问题的现象)

一. 引言 接着看,把售票的问题给说完,这里涉及到一个小问题. 在我们进行线程任务封装,并进行线程对象创建的时候,我们发现确实通过四个线程能够将一百张票卖完.但是卖票的时候,会不会出现一些小问题呢?分析整个程序给大家展示一下. 现在有四个线程,都到了run方法中来运行.大家都知道,每个线程所属的栈区当中都有自己的run方法,比如它们同时在操作堆内存中的变量,叫做num. 假设这个num已经减到了1,这是个前提. 在num=1的情况下,四个线程Thread-0,Thread-1,Thread-2,

java的多线程:线程安全问题

什么是线程安全? 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作是不会发生数据冲突问题. 抢火车的例子: 一号窗口和二号窗口同时出售火车第九九张,部分火车票会重复出售. 结论发现,多个线程共享同一个全局成员变量时,做写的操作可能会发生数据冲突问题. 二.线程安全解决办法: 问:如何解决多线程之间线程安全问题 答:使用多线程之间同步synchronized或使用锁(lock). 问:为什么使用线程同步或使

多线程-线程安全问题

1.多线程-线程安全问题演示 多个线程对象运行同一个线程任务代码的时候,一个线程运行到判断语句后被临时阻塞了,下个线程继续判断,直接输出结果,前一个线程再输出的结果,可能会出问题 class Ticket implements Runnable{     private int num = 100;     public void run(){         while(true){             if(num>0){                 try{            

boost中asio网络库多线程并发处理实现,以及asio在多线程模型中线程的调度情况和线程安全。

1.实现多线程方法: 其实就是多个线程同时调用io_service::run for (int i = 0; i != m_nThreads; ++i)        {            boost::shared_ptr<boost::thread> pTh(new boost::thread(                boost::bind(&boost::asio::io_service::run,&m_ioService)));            m_l

再次理解多线程线程安全问题(理解java内存模型后)

1.多线程访问的共享资源存在线程安全问题, 无外乎访问两种共享资源. 1)多线程访问方法区数据.存在线程安全问题,通过加锁 2)多线程访问实例变量:被访问对象是单例时存在线程安全,被访问对象是多例时,是线程安全的. 来说说静态变量.实例变量.局部变量在多线程下的安全问题吧! (一)验证静态变量的线程安全性: (1)从程序执行的图中我们可以看出,执行结果中有错误数据,证明了静态变量是存在资源冲突问题的. (2)程序运行结果图: 5.结论:静态变量也称为类变量,属于类对象所有,位于方法区,为所有对象

多线程环境下的线程不安全问题(2)

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

《网络编程》线程

线程基本函数 当一个程序被启动时,只有一个主线程,若要实现对其他线程的基本操作,首先必须创建新的线程,新的线程创建可以使用 pthread_create 函数实现,该函数的 API 定义如下: /* 函数功能:创建新的线程: * 返回值:若成功则返回0,若出错则返回正的错误码: * 函数原型: */ #include <pthread.h> int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void*(*func)(v

JAVA多线程--线程的同步安全

每当我们在项目中使用多线程的时候,我们就不得不考虑线程的安全问题,而与线程安全直接挂钩的就是线程的同步问题.而在java的多线程中,用来保证多线程的同步安全性的主要有三种方法:同步代码块,同步方法和同步锁.下面就一起来看: 一.引言 最经典的线程问题:去银行存钱和取钱的问题,现在又甲乙两个人去同一个账户中取款,每人取出800,但是账户中一共有1000元,从逻辑上来讲,如果甲取走800,那么乙一定取不出来800: 1 package thread.threadInBank; 2 3 /** 4 *