使用目标c中的@synchronized指令解决死锁和活锁问题

Vas*_*lis 3 mutex objective-c synchronized thread-safety

从苹果的"线程编程指南"中我读到"避免死锁和活锁情况的最佳方法是一次只能锁一次".如果我更喜欢在我的代码中使用@synchronized指令,这意味着我应该这样做:

@synchronized(aObj){

@synchronized(bObj) {

    // do sth with the aObj and bObj here     
} 
Run Code Online (Sandbox Code Playgroud)

}

而不是这个:

@synchronized(aObj,bObj){

 // do sth with the aObj and bObj here
Run Code Online (Sandbox Code Playgroud)

}

?? 如果不是,"一次锁定一次是什么意思?".谢谢...

pax*_*blo 9

避免死锁的最佳方法是确保所有线程都尝试以相同的顺序锁定和解锁对象.就是这样,真的.

通过遵循这一个简单的规则,死锁的可能性为零.

只要订单一致,无论您是尝试在一次点击还是在一个重要的时间范围内分配所有需要的锁定都无关紧要.换句话说,不要做:

Thread A        Thread B
========        ========
lock a          lock b
lock b          lock a
Run Code Online (Sandbox Code Playgroud)

这可能导致序列:

  • 锁a.
  • B锁b.
  • A试图锁定b,停止并等待.
  • B试图锁定,停止和等待.

现在两个线程都在等待另一个线程释放他们所需的资源,因此死锁.

如果更改线程B以便其锁定a,并b按照这个顺序,僵局变得不可能.