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)}