@synchronized()

来源:互联网 发布:淘宝首页前端源代码 编辑:程序博客网 时间:2024/06/16 14:02

Objective-c支持多线程的应用程序。 这意味着,两个线程可以尝试修改在同一时间相同的对象,这种情况可能导致在程序中的严重问题。 为了保护代码部分在一个时间被执行在多个线程,Objective - C提供了@synchronized()同步指令。




@ synchronized()指令锁定的的代码段由单个线程使用。其他线程被阻塞,直到该线程退出保护的代码也就是说,只有在过去的最后声明后才继续执行@ synchronized()块再见哦那个的代码。




@ synchronized()指令作为任何 Objective - C对象和它自己唯一的参数。这个对象被称 为一个相互排斥或互斥信号量。它允许一个线程锁定代码段以防止其他线程使用。您应该使用单独的信号量来保护一个程序的不同关键部分。在创造一切相互排斥成为多线程应用程序之前,这样做是最安全的,以避免竞争条件。




清单10-1 显示了一个代码示例采用自同步的互斥访问当前对象的实例方法。你可以采取类似的方法来同步相关类的类的方法,使用类对象而不是自我。在后一种情况下,当然,只有一个线程在一个时间允许执行一个类方法,因为对所有呼叫者只有一个类的对象共享。

 

Listing 10-1 Locking a method using self

 

- (void)criticalMethod


{

    

    @synchronized(self)

    

    {

        

        // Critical code.

        

        ...

        

    }

    

}

 

清单10-2使 用当前选择,_cmd作为互斥。这种同步是有益的只有当正在同步的方法有一个唯一的名称。这是因为没有其他对象或类将被允许执行一个具有相同名称不同的方法,直到当前方法的结束。

 

Listing 10-2 Locking a method using _cmd

 

- (void)criticalMethod


{

    

    @synchronized(NSStringFromSelector(_cmd))

    

    {

        

        // Critical code.

        

        ...

        

    }

    

}

 

 

清单10-3显示了一个普遍的做法。在关键代码执行前,得从Account类获取一个信号量,并用它来锁的关键部分。该Account类可以在 initialize 方法中创建信号量。

 

Listing 10-3 Locking a method using a custom semaphore

 

Account *account = [Account accountFromString:[accountField stringValue]];


// Get the semaphore.


id accountSemaphore = [Account semaphore];


@synchronized(accountSemaphore)


{

    

    // Critical code.

    

    ...

    

}

 

 

Objective - C的同步功能支持递归和重载代码。在一个递归中,一个线程可以使用一个信号量几次。其他线程被阻止使用它,直到线程释 放所  与它获得锁,也就是说,每一个@synchronized()块正常退出或抛出一个异常。




当同步代码快@synchronized()抛出一个异常,在Objecti

原创粉丝点击