线程的同步执行
这个东西其实就是 一个加锁。如果self 其他线程访问,则会阻塞。这样做一般是用来对单例 进行一个死锁的保护
如下:
staticConfig* instance =nil;
+(Config*) Instance {
@synchronized(self) {
if(nil==instance) {
[selfnew];
}
}
returninstance;
}
+(id)allocWithZone:(NSZone*)zone {
@synchronized(self) {
if(instance==nil){
instance= [superallocWithZone:zone];
returninstance;
}
}
returnnil;
}
Objective-C支持程序中的多线程。这就意味着两个线程有可能同时修改同一个对象,这将在程序中导致严重的问题。为了避免这种多个线程同时执行同一段代码的情况,Objective-C提供了@synchronized()指令。
指令@synchronized()通过对一段代码的使用进行加锁。其他试图执行该段代码的线程都会被阻塞,直到加锁线程退出执行该段被保护的代码段,也就是说@synchronized()代码块中的最后一条语句已经被执行完毕的时候。
指令@synchronized()需要一个参数。该参数可以使任何的Objective-C对象,包括self。这个对象就是互斥信号量。他能够让一个线程对一段代码进行保护,避免别的线程执行该段代码。针对程序中的不同的关键代码段,我们应该分别使用不同的信号量。只有在应用程序编程执行多线程之前就创建好所有需要的互斥信号量对象来避免线程间的竞争才是最安全的。
列表12-1的代码中使用self作为互斥信号量来实现当前对象对实例方法访问的同步。
-(void)criticalMethod
{
@synchronized(self)
{
//关键代码;
}
}
网友评论