在目标c中使用@synchronized指令产生死锁和活动锁问题

|| 从苹果的《线程编程指南》中,我读到“避免死锁和活锁情况的最佳方法是一次只锁一个”。如果我更喜欢在代码中使用@synchronized指令,则意味着我应该执行以下操作:   @synchronized(aObj){
@synchronized(bObj) {

    // do sth with the aObj and bObj here     
} 
     } 代替这个:   @synchronized(aObj,bObj){
 // do sth with the aObj and bObj here
     } ??如果不是,则表示“一次锁一次?”。谢谢...     
已邀请:
避免死锁的最佳方法是确保所有线程尝试以相同顺序锁定和解锁对象。就是这样。 通过遵循这一简单规则,死锁的可能性为零。 只要顺序一致,是否尝试一次命中还是在很长的时间内分配所有需要的锁都没有关系。换句话说,永远不要做:
Thread A        Thread B
========        ========
lock a          lock b
lock b          lock a
这可能导致顺序: 一把锁。 B锁b。 A尝试锁定b,然后停止并等待。 B尝试锁定a,停止并等待。 现在,两个线程都在等待对方释放它们所需的资源,从而导致死锁。 如果更改线程
B
,使其依次锁定
a
b
,则死锁将变得不可能。     
同时持有多个锁会立即引发死锁,如果两个线程以不同的顺序获得相同的锁,它们最终将永远彼此等待。 此问题可用于解决强制执行锁定顺序的问题。
 @synchronized(MIN(a, b))
    {
        @synchronized(MAX(a, b))
        {
            // do stuff, safely
        }
    }
这也适用于其他锁定结构。喜欢:
 NSLock *a = [[NSLock alloc] init];
    NSLock *b = [[NSLock alloc] init];

    [MIN(a, b) lock];
    [MAX(a, b) lock];

    [MAX(a, b) unlock];
    [MIN(a, b) unlock];
    
您的代码的两个版本都是邪恶的,并且会导致死锁。忠告的意思是你应该写
@synchronized (obj1) { ... }
@synchronized (obj2) { ... }
如果一个线程以与另一线程不同的顺序执行嵌套锁(先使用一个锁,然后使用另一个锁),则可能会出现死锁。避免这种情况的一个简单规则是永远不要有两个嵌套的锁。     

要回复问题请先登录注册