iOS底层系列之<35>--多线程<五>-锁<1>OSSpinLock

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值