iOS多线程开发小demo4,线程的同步问题

//  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:多条线程按顺序的执行任务

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

iOS多线程开发小demo4,线程的同步问题

时间: 2024-12-29 10:16:06

iOS多线程开发小demo4,线程的同步问题的相关文章

iOS多线程开发小demo5 线程间的通信

// DYFViewController.m // 623-06-线程间的通信 // // Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @property (weak, nonatomic) IBOutlet UIImag

iOS多线程开发小demo3,线程的状态

// Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @property (nonatomic, strong) NSThread *thread; @end @implementation DYFViewController

iOS多线程开发小demo6 GCD

// DYFViewController.m // 623-07-GCD // // Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @property (weak, nonatomic) IBOutlet UIImageVi

iOS多线程开发小demo

首先演示一下主线程的阻塞 // DYFViewController.m // 623-01-阻塞多线程 // // Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @end @implementation DYFViewCon

iOS多线程开发小demo2,NSThread篇

用NSThread创建子线程的3种方法 // DYFViewController.m // 623-02-pthread // // Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" #import <pthread.h> @interface DYFViewController

iOS多线程开发小demo7 GCD队列组

// DYFViewController.m // 623-08-队列组 // // Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @property (weak, nonatomic) IBOutlet UIImageVi

iOS多线程开发——NSThread浅析

在IOS开发中,多线程的实现方式主要有三种,NSThread.NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,可以参考<iOS多线程开发--NSOperation/NSOperationQueue浅析><iOS多线程开发--GCD的使用与多线程开发浅析>.以及对于多线程中的同步异步,并行串行等概念,我在<GCD实践--串行队列/并发队列与iOS多线程详解>中也有较为详细的讲解.为了学习的完整性,今天我们主要从代码层面来实现

IOS多线程开发

本文转载至 http://blog.csdn.net/davidsph/article/details/8171607 IOS的多线程,一般分为三种方式: 1,Thread;2, Cocoa operations;3, Grand Central Dispatch (GCD) (iOS4 才开始支持) 下面简单说明一下: 1:NSThread   创建方式主要有两种: [NSThread detachNewThreadSelector:@selector(myThreadMainMethod:)

iOS多线程开发——GCD的使用与多线程开发浅析(二)

对于iOS多线程开发,我们时刻处于学习之中,在看书中,看文档中,项目开发中,都可以去提高自己.最近刚看完了<Objective-C高级编程 iOS与OS X多线程和内存管理>这本书后,对多线程有了更为深入的理解,故在此做一个总结与记录.这本书我已经上传至网盘  https://pan.baidu.com/s/1c2fX3EC ,这本书是iOS开发者必读的书之一,写得很不错,欢迎大家下载阅读.书的封面如下,故也称狮子书: . (1)多线程会遇到的问题 . 多线程会出现什么问题呢?当多个线程对同一