没长正的技术专栏 勤动手、多思考

高并发之ReentrantLock分析

2018-08-03

阅读:


1.1 AQS

​ AbstractQueuedSynchronizer: 互斥、共享

2021-11-27_Locks类型

1.2 ReentrantLock设计思路

满足线程的互斥特性;意味着同一个时刻,只允许一个线程进入到加锁的代码中。-> 多线程环境下,线程的顺序访问。

    1. 一定会涉及到锁的抢占:
    //需要有一个标记来实现互斥。全局变量(0,1)   ==> CAS
    
    1. 抢占到了锁,怎么处理

      //不需要处理,直接执行。
      
    2. 没抢占到锁,怎么处理

      需要等待

      //让处于排队中的线程,如果没有抢占到锁,则直接先阻塞->释放CPU资源)。
      
      • 如何等待?
        • wait/notify(线程通信的机制,无法指定唤醒某个线程)
        • LockSupport.park/unpark(阻塞一个指定的线程,唤醒一个指定的线程)
        • Condition (await/notify/notifyAll)

      需要排队

      //允许有N个线程被阻塞,此时线程处于活跃状态
      
      • 通过一个数据结构,把这N个排队的线程存储起来。

        //阻塞队列(双向链表)
        
    3. 抢占到锁,如何释放?

      // LockSupport.unpark(Thread)  -> 唤醒处于队列中指定的线程。
      
    4. 锁抢占的公平性(是否允许插队)

      1. 公平锁
      2. 非公平锁
    5. 重入的特性

      //	识别是否是同一个ThreadID
      

1.3 Lock 与 Condition

2021-11-29_Lock与Condition图解

参考:

使用Atomic


欢迎拍砖,多多交流,转载请注明出处:[没长正的技术专栏](http://blog.meizhangzheng.com) 如涉及侵权问题,请发送邮件到xsj34567@163.com,如情况属实本人将会尽快删除。


Comments

Content