@synchronized关键字与self关键字

来源:互联网 发布:黑桐谷歌淘宝店 编辑:程序博客网 时间:2024/05/16 15:21

  

2013-12-12 22:51:01|  分类1.http://www.xcodechina.com/archiver/?tid-117.html

2.http://www.cnblogs.com/mjios/archive/2013/04/20/3031758.html
3.http://zjqzy03080312.blog.163.com/blog/static/185742807201282455238613/

=======单例=======
+ (BGMusicManager *)shareManager
{
    @synchronized(self)
    {
        if (manager == nil)
        {
            manager = [[self alloc] init] ;
        }
    }
    return manager;
}

 @synchronized,代表这个方法加锁, 相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程例如B正在用这个方法,有的话要等正在使用synchronized方法的线程B运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

@synchronized 方法控制对类(一般在IOS中用在单例中)的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法锁方能执行,否则所属就会发生线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类,至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突(只要所有可能访问类的方法均被声明为 synchronized)。

synchronized 块:

  @通过 synchronized关键字来声明synchronized 块。语法如下:
  @synchronized(syncObject) { }
  synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。

=====================================================================================

在单例中都有一个上面的一个函数,为什么这个时候这个单例还没有创建就可以用@synchronized(self)的呢?
@synchronized(self) 是封锁住当前这个实例资源,通俗点就是当前只能有一个进程或者线程访问它本身资源。防止并发操作;
@synchronized()的参数是作为标示,如果我写个MyLock传入也是可以的,这里self也是个标示,你的疑惑是self明明没有实例,传入有什么用?你忽略了个细节,你看看这个是什么方法,静态方法,OBjective-C语言是运行时检测,所以在调用过程中,静态方法的self等于类本身。

+(void)test

{

    if(self == [Books class])

    {

        NSLog(@"静态方法中的self==类本身");

    }

    @synchronized([Books class]){};

}

这样写是没问题的。

self在静态方法中代表的是类本身,在动态方法中代表的是类的实例。

1> 在动态方法中,self代表着"对象"

2> 在静态方法中,self代表着"类"

3> 万变不离其宗,记住一句话就行了:self代表着当前方法的调用者

4>在静态方法中不能用self调用动态方法。

5>在动态方法中不能用self调用静态方法。用[self class]调用。

0 0
原创粉丝点击