1、自旋锁OSSpinLock
基类:
BaseLockViewController.h
@interface BaseLockViewController : UIViewController
- (void)saveMoney;
- (void)drawMoney;
- (void)saleTicket;
@end
BaseLockViewController.m
#import "BaseLockViewController.h"
@interface BaseLockViewController ()
@property (assign, nonatomic) int tickets;
@property (assign, nonatomic) int totalMoney;
@end
@implementation BaseLockViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.view setBackgroundColor:[UIColor whiteColor]];
self.tickets = 10;
self.totalMoney = 1000;
}
//------------------------------------存钱、取钱问题----------------------------------//
- (void)saveMoney {
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)saleTicket {
int oldTicketsCount = self.tickets;
sleep(.3);
oldTicketsCount--;
NSLog(@"当前剩余--%d--%@",oldTicketsCount,[NSThread currentThread]);
self.tickets = oldTicketsCount;
}
@end
自旋锁介绍
OSSPinLock.h
#import "BaseLockViewController.h"
NS_ASSUME_NONNULL_BEGIN
@interface OSSPinLock : BaseLockViewController
@end
NS_ASSUME_NONNULL_END
OSSPinLock.m
#import "OSSPinLock.h"
#import <libkern/OSAtomic.h>
@interface OSSPinLock ()
// 自旋锁
@property (assign, nonatomic) OSSpinLock lock;
@property (assign, nonatomic) OSSpinLock lock1;
@end
@implementation OSSPinLock
- (void)viewDidLoad {
[super viewDidLoad];
self.lock = OS_SPINLOCK_INIT;
self.lock1 = OS_SPINLOCK_INIT;
[self concurrentMoney];
[self concurrentSaleTicket];
}
- (void)__saveMoney {
OSSpinLockLock(&_lock);
[super saveMoney];
OSSpinLockUnlock(&_lock);
}
- (void)__drawMoney {
OSSpinLockLock(&_lock);
[super drawMoney];
OSSpinLockUnlock(&_lock);
}
- (void)__saleTicket {
OSSpinLockLock(&_lock1);
[super saleTicket];
OSSpinLockUnlock(&_lock1);
}
- (void)concurrentMoney {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
[self __saveMoney];
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
[self __drawMoney];
}
});
}
- (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];
}
});
}
@end
2、问题
可能优先级比较高的线程会一直占用较多资源,优先级比较低的线程一直无法解锁,就会带来这样的安全隐患问题。
3、下一章中介绍代替方案os_unfair_lock