@synchronized是否阻止整个线程

use*_*951 2 objective-c synchronized grand-central-dispatch xcode4.3

说你做

MyLock *lock = [[MyLock new] autorelease];
@synchronized(lock) {
    NSLog(@"Hello World");
//some very long process
}
Run Code Online (Sandbox Code Playgroud)

在主线程中.这是否意味着//直到某个很长的进程完成,主线程被锁定了?如果其他一些线程调用

    //Update on the main thread
    dispatch_sync(dispatch_get_main_queue(), ^{
        //Do some updates
    });
Run Code Online (Sandbox Code Playgroud)

永远不会调用一些更新?我对么?

omz*_*omz 6

如果第一个代码段中的代码永远不会完成,则无论@synchronized语句如何,都不会调用第二个代码.线程被您正在执行的代码阻止.该@synchronized语句是为了在多个线程之间同步数据访问并且有用,它要求所有参与的线程实际使用该语句.它不会"神奇地"锁定对数据结构的访问,除非所有参与的线程都"同意"它.

您不能用于@synchronized确保在给定(单个)线程上只执行一个方法,无论如何都是如此.

为了给你一个使用它的具体例子,假设NSMutableArray你想要保护你不要同时从不同的线程修改(这可能导致数据损坏).在这种情况下,您始终可以在@synchronized具有相同锁定令牌的块中访问它.

例:

//Thread 1:
@synchronized (myArray) {
    [myArray addObject:@"foo"];
}

//Thread 2:
@synchronized (myArray) {
    [myArray removeObjectAtIndex:0];
}
Run Code Online (Sandbox Code Playgroud)

这将确保所包含的代码块@synchronized永远不会同时执行.当一个线程进入该块时,其他线程会一直等到它完成,但前提是它们也使用相同的@synchronized语句.如果您忘记在一个线程上使用它,如果您在另一个线程上使用它,它根本没有帮助.