java中锁的分类

一、锁的整体分类

在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有互斥锁也有共享锁,其中写锁是互斥锁,读锁是共享锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值