美文网首页
线程安全

线程安全

作者: AntKing | 来源:发表于2017-04-28 13:29 被阅读0次

当多个线程同时访问同一块资源时,会造成资源的读写错误,意思就是同一个文件,同时有人在读,又有人在写入,肯定是要出错的,那么这就涉及到线程安全,线程安全我们使用互斥锁来防止,代码如下

#import "ViewController.h"

@interface ViewController ()
/** A */
@property (nonatomic, strong) NSThread *threadA;
/** B */
@property (nonatomic, strong) NSThread *threadB;
/** C */
@property (nonatomic, strong) NSThread *threadC;

@property (nonatomic, assign) NSInteger totalCount;
@end

@implementation ViewController

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    
    //设置中票数
    self.totalCount = 100;
    
     self.threadA = [[NSThread alloc]initWithTarget:self selector:@selector(saleTicket) object:nil];
     self.threadB = [[NSThread alloc]initWithTarget:self selector:@selector(saleTicket) object:nil];
     self.threadC = [[NSThread alloc]initWithTarget:self selector:@selector(saleTicket) object:nil];
    
    self.threadA.name = @"A";
    self.threadB.name = @"B";
    self.threadC.name = @"C";
    
    //启动线程
    @synchronized(self) {
        [self.threadA start];
        [self.threadB start];
        [self.threadC start];
    }
    
}

-(void)saleTicket
{
    while (1) {
        
    //锁:必须是全局唯一的
    //1.注意枷锁的位置
    //2.注意枷锁的前提条件,多线程共享同一块资源
    //3.注意加锁是需要代价的,需要耗费性能的
    //4.加锁的结果:线程同步
        
    @synchronized(self) {
        //线程1
        //线程2
        //线程3
        NSInteger count = self.totalCount;
        if (count >0) {
            
            for (NSInteger i = 0; i<1000000; i++) {
            }
            
            self.totalCount = count - 1;
            //卖出去一张票
            NSLog(@"%@卖出去了一张票,还剩下%zd张票", [NSThread currentThread].name,self.totalCount);
        }else
        {
            NSLog(@"不要回公司上班了");
            break;
        }
        }
    }
    
}

@end

  • 我们在创建单列时有时候为了考虑线程安全的问题,也会使用互斥锁
static PayManager *_instance = nil;


/**
 * alloc 方法内部会调用这个方法
 */
+(id)allocWithZone:(struct _NSZone *)zone{
    if (_instance == nil) {//防止频繁加锁
        @synchronized(self) {
            if (_instance == nil) {//防止创建多次
                _instance = [super allocWithZone:zone];
            }
        }
    }
    return _instance;
}

/**
 * 实例化类
 */
+(instancetype)sharedMusicTool{
    if (_instance == nil) {//防止频繁枷锁
        @synchronized(self) {
            if (_instance == nil) {//防止创建多次
                _instance = [[self alloc] init ];
            }
        }
    }
    return _instance;
}

/**
 * 重写copy方法,保证copy出来的也是单例类
 */
-(id)copyWithZone:(NSZone *)zone{
    return _instance;
}

相关文章

  • atomic & nonatomic

    什么是线程安全??? 线程安全:多线程操作共享数据不会出现想不到的结果就是线程安全的,否则,是线程不安全的。 at...

  • ConcurrentHashMap源码设计分析

    二、线程安全(Thread-safe)的集合对象:● Vector 线程安全● HashTable 线程安全● S...

  • HashMap 和 Hashtable 的区别

    线程安全: HashMap 是非线程安全的,而 Hashtable 是线程安全的,因为 Hashtable 内部的...

  • Java 的 StringBuffer 和 StringBuil

    区别就是:线程安全,StringBuffer 是线程安全的,StringBuilder 不是线程安全的。 他俩的实...

  • Java单例模式,线程安全

    懒汉式:线程安全,开销大 双重检查锁:线程安全,根据需求使用 静态内部类锁:线程安全,比较推荐 饿汗式:线程安全,...

  • 2018-06-12 第三十七天

    一、线程安全 线程安全的问题,是针对多线程的程序。单线程的情况下,是不存在线程安全问题。 产生线程安全问题的原因:...

  • 线程安全知多少

    1. 如何定义线程安全 线程安全,拆开来看: 线程:指多线程的应用场景下。 安全:指数据安全。 多线程就不用过多介...

  • JAVA 线程安全

    线程安全定义 一个类在可以被多个线程安全调用时就是线程安全的。 线程安全分类 线程安全不是一个非真即假的命题,可以...

  • synchronized锁

    一、线程安全的概念与synchronized 1、线程安全概念 并发程序开发的一大关注重点就是线程安全,线程安全就...

  • 线程安全的NSMutableDictionary

    NSDictionary是线程安全的,NSMutableDictionary是线程不安全的。利用锁来保证线程的安全...

网友评论

      本文标题:线程安全

      本文链接:https://www.haomeiwen.com/subject/mkgozttx.html