1 // 2 // ViewController.m 3 // 05-递归锁(recursive)+条件锁(condition) 4 // 5 // Created by mac on 16/4/20. 6 // Copyright © 2016年 mac. All rights reserved. 7 // 8 /* 9 10 3). 互斥锁 11 NSLock *_lock; 12 13 3)NSLock :不能多次调用,会产生死锁 14 15 2016-04-20 16:06:44.600 05-递归锁(recursive)+条件锁(condition)[17107:4573400] *** -[NSLock lock]: deadlock (<NSLock: 0x7feceb542400> '(null)') 16 2016-04-20 16:06:44.601 05-递归锁(recursive)+条件锁(condition)[17107:4573400] *** Break on _NSLockError() to debug. 17 18 1)NSRecursiveLock:可以多次调用,在递归函数中调用 19 对于递归锁:每次成功的lock都必须平衡调用unlock操作,只有所有的加锁和解锁都平衡时,锁才能真正的释放给其它线程所获得。 20 21 2)NSConditionLock: 22 保证加锁在condition1方法的unlockWithCondition之后进行 23 lockWhenConditon会阻止线程往下执行,直到条件为上一次解锁时设置的条件时才能继续往下执行。 24 条件锁可用于有特定顺序的处理流程中。 25 */ 26 27 #import "ViewController.h" 28 29 @interface ViewController () 30 31 @end 32 33 @implementation ViewController { 34 35 //1). 递归锁 36 NSRecursiveLock *_recursiveLock; 37 38 //2). 条件锁 39 NSConditionLock *_conditionLock; 40 41 //3). 互斥锁 42 NSLock *_lock; 43 } 44 45 - (void)viewDidLoad { 46 [super viewDidLoad]; 47 48 // [self recursiveLock]; //递归锁 49 [self conditionLock]; //条件锁 50 } 51 52 /** 53 * 1. 递归锁应用 54 */ 55 - (void)recursiveLock { 56 //普通lock 57 _lock = [[NSLock alloc] init]; 58 59 _recursiveLock = [[NSRecursiveLock alloc] init]; 60 61 [NSThread detachNewThreadSelector:@selector(recursiveAction:) toTarget:self withObject:@5]; 62 } 63 - (void)recursiveAction:(NSNumber *)value { 64 65 NSInteger currentValue = [value integerValue]; 66 67 NSInteger result = [self factorialMethod:currentValue]; 68 69 NSLog(@"%li", result); 70 } 71 - (NSInteger)factorialMethod:(NSInteger)value { 72 73 [_recursiveLock lock]; 74 //[_lock lock]; 75 76 //1. 递归的出口 77 if (value == 0) { 78 79 [_recursiveLock unlock];//第2种情况下解锁 80 //[_lock unlock]; 81 82 return 1; 83 } 84 85 [_recursiveLock unlock]; //第1种情况下解锁 86 //2. 常规表达式 87 return value * [self factorialMethod:value - 1]; 88 89 } 90 91 /** 92 * 2. 条件锁应用 93 */ 94 - (void)conditionLock { 95 96 _conditionLock = [[NSConditionLock alloc] init]; 97 98 [NSThread detachNewThreadSelector:@selector(conditionAction) toTarget:self withObject:nil]; 99 100 [NSThread detachNewThreadSelector:@selector(conditionLockAction) toTarget:self withObject:@10]; 101 } 102 - (void)conditionAction { 103 104 [_conditionLock lock]; 105 106 NSLog(@"_conditionLock"); 107 108 [NSThread sleepForTimeInterval:1]; 109 110 //解锁,并且设置下次加锁条件 tag==10 111 [_conditionLock unlockWithCondition:10]; 112 } 113 114 - (void)conditionLockAction { 115 116 //保证加锁在condition1方法的unlockWithCondition之后进行 117 [NSThread sleepForTimeInterval:2]; 118 119 //lockWhenCondition会阻止线程往下执行,直到条件为上一次解锁时设置的调件时才能继续往下执行:条件锁可用于特定顺序的处理流程中。 120 [_conditionLock lockWhenCondition:10]; 121 122 NSLog(@"conditionLockAction"); 123 124 [_conditionLock unlock]; 125 } 126 127 @end