@synchronized 锁用法

来源:互联网 发布:a家家具淘宝官网旗舰店 编辑:程序博客网 时间:2024/06/03 05:01

synchronized   这个主要是考虑多线程的程序,这个指令可以将{ } 内的代码限制在一个线程执行,如果某个线程没有执行完,其他的线程如果需要执行就得等着。

Objective-C支持程序中的多线程。这就意味着两个线程有可能同时修改同一个对象,这将在程序中导致严重的问题。为了避免这种多个线程同时执行同一段代码的情况,Objective-C提供了@synchronized()指令。

 

指令@synchronized()通过对一段代码的使用进行加锁。其他试图执行该段代码的线程都会被阻塞,直到加锁线程退出执行该段被保护的代码段,也就是说@synchronized()代码块中的最后一条语句已经被执行完毕的时候。

 

指令@synchronized()需要一个参数。该参数可以使任何的Objective-C对象,包括self。这个对象就是互斥信号量。他能够让一个线程对一段代码进行保护,避免别的线程执行该段代码。针对程序中的不同的关键代码段,我们应该分别使用不同的信号量。只有在应用程序编程执行多线程之前就创建好所有需要的互斥信号量对象来避免线程间的竞争才是最安全的。


大家可以参照一下代码进行尝试

首先创建一个类,里面有3个方法

#import <Foundation/Foundation.h>@interface TestClass : NSObject-(void)run;-(void)eat;-(void)beat;@end#import "TestClass.h"@implementation TestClass-(void)run{        for (int i = 0; i < 5; i++) {             NSLog(@"run:%d====%@", i, [NSThread currentThread]);        }    }-(void)eat{        for (int i = 0; i < 5; i++) {            NSLog(@"eat:%d====%@", i, [NSThread currentThread]);        }    }-(void)beat{        for (int i = 0; i < 5; i++) {            NSLog(@"beat:%d====%@", i, [NSThread currentThread]);        }    }
然后创建
三个异步队列,执行TestClass的三个方法

#import "ViewController.h"#import "TestClass.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    TestClass * test1 = [[TestClass alloc] init];    NSOperationQueue * queue = [[NSOperationQueue alloc] init];    NSBlockOperation * operation1 = [NSBlockOperation blockOperationWithBlock:^{        [test1 run];            }];    NSBlockOperation * operation2 = [NSBlockOperation blockOperationWithBlock:^{        [test1 eat];    }];    NSBlockOperation * operation3 = [NSBlockOperation blockOperationWithBlock:^{        [test1 beat];    }];            [queue addOperations:@[operation1,operation2,operation3] waitUntilFinished:YES];    }

结果为



当着三个方法被改为

-(void)run{    @synchronized (self) {        for (int i = 0; i < 5; i++) {             NSLog(@"run:%d====%@", i, [NSThread currentThread]);        }    }}-(void)eat{    @synchronized (self) {        for (int i = 0; i < 5; i++) {            NSLog(@"eat:%d====%@", i, [NSThread currentThread]);        }    }}-(void)beat{    @synchronized (self) {        for (int i = 0; i < 5; i++) {            NSLog(@"beat:%d====%@", i, [NSThread currentThread]);        }    }}
结果为

0 0
原创粉丝点击