递归锁+条件锁+互斥锁-04-多线程

  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

 

posted on 2016-04-20 16:41  爱你久久iOS  阅读(608)  评论(0编辑  收藏  举报

导航