代码混淆马甲包混淆----原文地址:https://blog.csdn.net/u014220518/article/details/95482006
1.OSSpinLock处理效率比synchronized要快很多.如果是频繁操作,推荐使用
模拟一个耗时操作分别加这两种锁 消耗的时间比较一下
- (void)OSSpinLockAndSynchronized{
OSSpinLock spinLock = OS_SPINLOCK_INIT;
double_t lastTime = CFAbsoluteTimeGetCurrent();
for (NSInteger i = 0;i < KRunTimes; i++) {
OSSpinLockLock(&spinLock);
OSSpinLockUnlock(&spinLock);
}
double_t curTime = CFAbsoluteTimeGetCurrent();
NSLog(@"OSSpinLock:%f ms",(curTime - lastTime) * 1000);
//同步
id obj = [NSObject new];
lastTime = CFAbsoluteTimeGetCurrent();
for (NSInteger i = 0; i < KRunTimes; i++) {
@synchronized (obj) {
}
}
curTime = CFAbsoluteTimeGetCurrent();
NSLog(@"synchroniz:%f ms",(curTime - lastTime) * 1000);
}
2.自旋锁的使用给某一个资源数据块加锁 比如卖票 抢票等资源 如果不加锁的话会造成数据不准确
- (void)tickeCountNumbers:(NSInteger)ticketCount
{
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
for (int i = 0; i < 5; i++) {
[self saleTicket];
NSLog(@"我是第一个");
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 5; i++) {
[self saleTicket];
NSLog(@"我是第二个");
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 5; i++) {
[self saleTicket];
NSLog(@"我是第三个");
}
});
}
- (void)saleTicket
{
// 从访问数据之前开始加锁
/* // 初始化锁 (注意加锁,解锁的过程都要为同一把锁才行,不然每次都创建一个新锁,加锁解锁没有意义)
OSSpinLock lock = OS_SPINLOCK_INIT;如果Lock为局部变量,意味着每次进来这个lock都是新的最好写成一个全局的
self.lock = lock;
*/
// 加锁
NSLog(@"========%p",&_lock);
OSSpinLockLock(&_lock);
int oldTicketCount = self.ticketsCount;
sleep(.2);
oldTicketCount--;
self.ticketsCount = oldTicketCount;
NSLog(@"剩余%d票,----%@----",oldTicketCount,[NSThread currentThread]);
// 用完了再解锁
OSSpinLockUnlock(&_lock);
// 创建了锁,再加锁加锁
}