#import "ViewController.h"
@interface ViewController ()
{
    NSInteger _cnt;
    NSLock *_lock;
}
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    //必须先创建锁
    _lock = [[NSLock alloc] init];
    
    [NSThread detachNewThreadSelector:@selector(thread1Click) toTarget:self withObject:nil];
    [NSThread detachNewThreadSelector:@selector(thread2Click) toTarget:self withObject:nil];
}
/*
 下面两个线程 执行的函数 共同操作同一个资源变量
 如果我们不做任何处理 那么两个线程就会争抢资源,这样就达不到我们想要的效果,数据有可能导致比较混乱
 
 //如果两个线程要操作同一个资源,那么我们一般要进行加锁保护,当访问资源的时候进行加锁,访问结束 解锁
 
 */
#pragma mark - 子线中调用的函数
//线程1想做 两次执行 之间 间隔10
- (void)thread1Click{
    NSLog(@"线程1开始");
    //加锁
    /*
     一旦线程 执行 [_lock lock],先检测一下 有没有加锁,如果加锁那么当前线程就会阻塞 直到 这个锁解锁之后 才能继续执行,如果 锁 没有锁着,立即加上锁锁住继续执行下面的代码
     同一个资源多个线程必须是同一把锁
     
     
     //加锁的话要注意防止死锁
     */
    [_lock lock];
    for (NSInteger i = 0; i < 10; i++) {
        _cnt += 10;
        NSLog(@"%s_cnt:%ld",__func__,_cnt);
        [NSThread sleepForTimeInterval:0.5];
    }
    
    
    [_lock unlock];
    NSLog(@"线程1即将结束");
}
//线程2想要的现象是 每次间隔2
- (void)thread2Click{
    NSLog(@"线程2开始");
    
    [_lock lock];
    for (NSInteger i = 0; i < 10; i++) {
        _cnt -= 2;
        NSLog(@"%s_cnt:%ld",__func__,_cnt);
        [NSThread sleepForTimeInterval:0.5];
    }
    [_lock unlock];
    
    NSLog(@"线程2即将结束");
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end 
原文:http://my.oschina.net/u/2410306/blog/529420