一、synchronized()
概述:@synchronized() 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。
使用范围:一般在公用变量的时候使用,如单例模式或者操作类的static变量中使用。
参数:@synchronized()指令的唯一参数可以使用任何OC对象,包括self。这个对象就是我们所谓的信号量。这个允许线程锁住一个代码块以防它被别的线程使用。你应当使用不同的信号量来保护程序中不同能够的关键部分。最安全的是,在应用程序进入多线程之前,为所有需要互斥的创建互斥信号量。
举例:
# import "NetworkManager.h"
static NetworkManager *network = nil;
@implementation NetworkManager
+ (NetworkManager *)getNetworkInstance{
@synchronized(self){
if (nil == network){
network = [[NetworkManager alloc] init];//创建单例
{
}
return network;
}
二、dispatch_once()
该方法的作用就是执行且在整个程序的声明周期中,仅执行一次某一个对象。简直就是为单例而生的嘛。而且,有些我们需要在程序开头初始化的动作,如果为了保证其,仅执行一次,也可以放到这个来执行。
优点:
1. 线程安全。
2. 满足静态分析器的要求。
3. 兼容了ARC。
举例:
+ (NetworkManager *)sharedManager
{
static NetworkManager *sharedNetworkManagerInstance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
sharedNetworkManagerInstance = [[NetworkManager alloc] init];
});
return sharedNetworkManagerInstance;
}