美文网首页
递归锁 死锁。

递归锁 死锁。

作者: jemmy_xl | 来源:发表于2020-12-30 19:38 被阅读0次
  1. synchronized
    static NSString* A = @"A";

    /** B锁 /
    static NSString
    B = @"B";
    dispatch_async(queue, ^{
    // NSLog(@"%@",[self sourceOut]) ;
    @synchronized(A){
    NSLog(@"锁A0");
    sleep(2);
    @synchronized(B){
    NSLog(@"锁B0");
    }
    }
    });

    dispatch_async(queue, ^{
    @synchronized(B){
    NSLog(@"锁B1");

         @synchronized(A){
             NSLog(@"锁A1");
         }
     }
    

    });
    打印:2018-04-06 15:35:56.206903+0800 COCOCOCO[13309:566143] 锁A0
    2018-04-06 15:35:56.206939+0800 COCOCOCO[13309:566145] 锁B1

  1. NSLock
    [self.lock lock];
    [self.lock lock];//由于当前线程加锁,现在再次加同样的锁,需等待当前线程解锁,把当前线程挂起,不能解锁
    [_lock unlock];
    [_lock unlock];
  1. 递归锁。 核心:允许同一个线程对一把锁进行重复加锁。 如果不是同一线程那么将死锁
  • (void)__initMutexLock:(pthread_mutex_t *)mutex{
    // 递归锁:允许同一个线程对一把锁进行重复加锁

    // 初始化属性
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
    // 初始化锁
    pthread_mutex_init(mutex, &attr);
    // 销毁属性
    pthread_mutexattr_destroy(&attr);
    }

  • (void)viewDidLoad {
    [super viewDidLoad];

    [self __initMutexLock:&_MutexLock];

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
    pthread_mutex_lock(&_MutexLock);
    NSLog(@"加锁 %s =11111== %@",func, [NSThread currentThread]);

      dispatch_sync(dispatch_get_main_queue(), ^{
          pthread_mutex_lock(&_MutexLock);
          NSLog(@"加锁 %s   =22222== %@",__func__, [NSThread currentThread]);
          NSLog(@"解锁 %s   ==2222222= %@",__func__, [NSThread currentThread]);
          pthread_mutex_unlock(&_MutexLock);
      });
    
      NSLog(@"解锁 %s   ==11111111= %@",__func__, [NSThread currentThread]);
    
      pthread_mutex_unlock(&_MutexLock);
    

    });
    }

2020-12-30 19:34:27.331898+0800 iOS-LockDemo[19500:315177] 加锁 -[ViewController viewDidLoad]_block_invoke =11111== <NSThread: 0x600002d107c0>{number = 5, name = (null)}

相关文章

  • 线程锁

    @synchronized 是递归锁,类似NSRecursiveLock,递归调用不会引起死锁,而NSLock是非...

  • 递归锁 死锁。

    synchronizedstatic NSString* A = @"A";/** B锁 /static NSSt...

  • NSRecursiveLock递归锁

    递归锁,它允许同一线程多次加锁,而不会造成死锁。以下的代码如果用NSLock就会造成死锁: //普通线程锁NSLo...

  • 死锁与递归锁

    一 . 死锁 代码示例 运行效果 原因:线程一手里拿着B锁的钥匙,但线程一想要继续执行代码必须要得到A锁的钥匙,而...

  • 线程锁学习笔记

    1.NSRecursiveLock 递归锁 递归锁可以被同一线程请求多次,而不会引起死锁(是指两个或两个以上的进程...

  • Python并发编程中关于死锁,递归锁,信号量的理解

    并发编程中关于死锁,递归锁,信号量的理解 1.死锁**** ​ 所谓死锁: 是指两个或两个以上的进程或线程在执行过...

  • 死锁

    线程饥饿死锁 锁顺序死锁 动态锁顺序死锁通过锁顺序来避免死锁 避免死锁

  • 锁-Lock-04

    可重入锁广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是...

  • python线程死锁与递归锁

    死锁现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作...

  • Mysql学习(六) 行锁

    行锁、死锁、死锁监测 两阶段协议锁,如何安排正确的事务语句,可能影响并发度的锁尽量往后放 死锁和死锁监测,如何减少...

网友评论

      本文标题:递归锁 死锁。

      本文链接:https://www.haomeiwen.com/subject/ckxkoktx.html