iOS底层系列之<34>--多线程<四>线程安全问题

1、多条线程访问同一数据带来的问题案例

#import "ViewController.h"

@interface ViewController ()
@property (assign, nonatomic) int tickets;
@property (assign, nonatomic) int totalMoney;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tickets = 10;
    self.totalMoney = 1000;
    
    [self concurrentMoney];
    
    sleep(2);
    NSLog(@"----------");
    [self concurrentSaleTicket];
}

//------------------------------------存钱、取钱问题----------------------------------//
- (void)savemMoney {
    int oldMoney = self.totalMoney;
    sleep(.3);
    oldMoney += 50;
    NSLog(@"存完钱--%d--%@",oldMoney,[NSThread currentThread]);
    self.totalMoney = oldMoney;
}

- (void)drawMoney {
    int oldMoney = self.totalMoney;
    sleep(.3);
    oldMoney -= 20;
    NSLog(@"取完钱--%d--%@",oldMoney,[NSThread currentThread]);
    self.totalMoney = oldMoney;
}

- (void)concurrentMoney {
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    dispatch_async(queue, ^{
        for (int i = 0; i < 10; i++) {
            [self savemMoney];
        }
    });
    
    dispatch_async(queue, ^{
        for (int i = 0; i < 10; i++) {
            [self drawMoney];
        }
    });
}




//------------------------------------卖票问题----------------------------------//
- (void)saleTicket {
    int oldTicketsCount = self.tickets;
    sleep(.3);
    
    oldTicketsCount--;
    NSLog(@"当前剩余--%d--%@",oldTicketsCount,[NSThread currentThread]);
    self.tickets = oldTicketsCount;
}

- (void)concurrentSaleTicket {
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    dispatch_async(queue, ^{
        for (int i = 0; i < 5; i++) {
            [self saleTicket];
        }
    });
    
    dispatch_async(queue, ^{
        for (int i = 0; i < 5; i++) {
            [self saleTicket];
        }
    });
    
    dispatch_async(queue, ^{
        for (int i = 0; i < 5; i++) {
            [self saleTicket];
        }
    });
}

打印结果:

2022-01-25 20:04:05.573241+0800 gcd[35711:2979032] 取完钱--980--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:05.573241+0800 gcd[35711:2979031] 存完钱--1050--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:05.573381+0800 gcd[35711:2979031] 存完钱--1100--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:05.573381+0800 gcd[35711:2979032] 取完钱--960--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:05.573464+0800 gcd[35711:2979031] 存完钱--1150--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:05.573481+0800 gcd[35711:2979032] 取完钱--940--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:05.573559+0800 gcd[35711:2979032] 取完钱--920--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:05.573562+0800 gcd[35711:2979031] 存完钱--1200--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:05.573636+0800 gcd[35711:2979032] 取完钱--900--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:05.573666+0800 gcd[35711:2979031] 存完钱--1250--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:05.573740+0800 gcd[35711:2979032] 取完钱--880--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:05.573878+0800 gcd[35711:2979031] 存完钱--1300--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:05.573974+0800 gcd[35711:2979032] 取完钱--860--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:05.574068+0800 gcd[35711:2979031] 存完钱--1350--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:05.574167+0800 gcd[35711:2979032] 取完钱--840--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:05.574255+0800 gcd[35711:2979031] 存完钱--1400--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:05.574347+0800 gcd[35711:2979032] 取完钱--820--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:05.574430+0800 gcd[35711:2979031] 存完钱--1450--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:05.581118+0800 gcd[35711:2979031] 存完钱--1500--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:05.581118+0800 gcd[35711:2979032] 取完钱--1430--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:07.573666+0800 gcd[35711:2978789] ----------

2022-01-25 20:04:07.573888+0800 gcd[35711:2979032] 当前剩余--9--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:07.573888+0800 gcd[35711:2979031] 当前剩余--9--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:07.573901+0800 gcd[35711:2979036] 当前剩余--9--<NSThread: 0x600001a58300>{number = 3, name = (null)}

2022-01-25 20:04:07.573994+0800 gcd[35711:2979032] 当前剩余--8--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:07.573999+0800 gcd[35711:2979031] 当前剩余--8--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:07.574020+0800 gcd[35711:2979036] 当前剩余--8--<NSThread: 0x600001a58300>{number = 3, name = (null)}

2022-01-25 20:04:07.574080+0800 gcd[35711:2979032] 当前剩余--7--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:07.574109+0800 gcd[35711:2979036] 当前剩余--7--<NSThread: 0x600001a58300>{number = 3, name = (null)}

2022-01-25 20:04:07.574110+0800 gcd[35711:2979031] 当前剩余--7--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:07.574248+0800 gcd[35711:2979032] 当前剩余--6--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:07.574367+0800 gcd[35711:2979031] 当前剩余--6--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:07.574463+0800 gcd[35711:2979032] 当前剩余--5--<NSThread: 0x600001a44540>{number = 5, name = (null)}

2022-01-25 20:04:07.574556+0800 gcd[35711:2979031] 当前剩余--5--<NSThread: 0x600001a13000>{number = 6, name = (null)}

2022-01-25 20:04:07.574816+0800 gcd[35711:2979036] 当前剩余--6--<NSThread: 0x600001a58300>{number = 3, name = (null)}

2022-01-25 20:04:07.578871+0800 gcd[35711:2979036] 当前剩余--5--<NSThread: 0x600001a58300>{number = 3, name = (null)}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值