java中锁的分类

宁睿  金牌会员 | 2024-8-2 10:28:15 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 567|帖子 567|积分 1709

一、锁的整体分类
在java中锁被分成了4类,即:
      1、可重入锁、不可重入锁
      2、乐观锁、悲观锁
      3、公平锁、非公平锁
      4、共享锁、互斥锁

二、可重入锁、不可重入锁
      1、可重入锁:当线程A已经拿到了锁S,当线程A再次场次获取锁S,线程A是可以获取
                             到锁S的;可重入锁拿到了几次,线程开释锁时就要开释同样次数的锁。
                            java中的synchronized、ReentrantLock、ReentrantReadWriteLock都是
                            可重入锁。
      2、不可重入锁:当线程A已经拿到了锁S,当线程A再次场次获取锁S,线程A是不可以获取
                                 到锁S的,由于锁S已经被占用;如 线程池 ThreadPoolExecutor 中的内部
                                 类 Worker 就是一个不可重入锁,其获取锁的代码如下图所示:
                                


三、乐观锁、悲观锁
       1、乐观锁
             获取不到锁资源时,可以让CPU调理再次实行获取锁资源(可以当作“自旋”,)
             java中提供的CAS操作就是一种乐观锁的实现方式,他不涉及线程的挂起操作,
             
       2、悲观锁
             当获取不到锁资源时,会将当火线程挂起(即将当火线程设置为 BLOCKED
             或 WAITING 状态);线程的挂起或涉及用户态和内核态之间的切换,而这种切换
             黑白常消耗CPU资源的,所以应该尽量制止用户态与内核态之间的切换。
             java中的synchronized、ReentrantLock、ReentrantReadWriteLock都是悲观锁

四、公平锁、非公平锁
       1、公平锁
             当线程A、B同时去竞争锁资源T,若A乐成拿到了锁T,线程B没有拿到锁T,线程B去
             列队等待A开释锁资源;此时线程C进来了,锁T被A持有,同时线程B在列队,此时线程
             C也必要去列队且C排到B后边。
       2、非公平锁
              当线程A、B同时去竞争锁资源T,若A乐成拿到了锁T,线程B没有拿到锁T,线程B去
             列队等待A开释锁资源;此时线程C进来了,线程C先去实行竞争一下锁资源,若C竞争
            到了锁T,则C持有锁资源,否则线程C必要去列队且C排到B后边。

            java中的synchronized 一定黑白公平锁
            java中的ReentrantLock、ReentrantReadWriteLock 可以是公平锁,也可以黑白公平锁。

五、共享锁、互斥锁
       1、共享锁
            同一时间点,可以有多个线程同时持有的锁称为共享锁
       2、互斥锁
            同一时间点,只有一个线程能持有的锁 称为互斥锁;

           java中的synchronized、ReentrantLock 是互斥锁
          java中的 ReentrantReadWriteLock有互斥锁也有共享锁,其中写锁是互斥锁,读锁是共享锁

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表