java基础之各种各样的锁


对于 Java 中的锁而言,一把锁也有可能同时占有多个标准,符合多种分类,根据分类标准我们把锁分为以下 7 大类别,分别是:

偏向锁/轻量级锁/重量级锁

这三种锁特指 synchronized 锁的状态

偏向锁:一个对象被初始化后,还没有任何线程来获取他的锁时,那么它就是可偏向的,当由第一个线程来访问它并尝试获取锁的时候,他就将这个线程记录下来,以后如果下次尝试获取锁的线程正式偏向锁的拥有者,就可以直接获取锁,开销很小,性能最好。
轻量级锁:由于synchronized中的代码很多情况是被多个线程交替执行的,而不是同时执行的也就是说并不存在实际的竞争,或者只有短时间的竞争,这种情况下用完全互斥的重量级锁时完全没有必要的。轻量级锁是指当锁原来是偏向锁的时候被另一个线程访问,说明存在竞争,那么偏向锁就会升级为轻量级锁。
重量级锁:重量级锁是互斥锁,他是利用操作系统的同步机制实现的,所以开销相对比较大。当多个线程直接有实际竞争,且锁竞争时间长的时候,轻量级锁不能满足要求,锁就会膨胀为重量级锁。重量级锁会让其他拿不到锁的线程进入阻塞状态。

可重入锁/非可重入锁

可重入锁指的是线程当前已经持有这把锁了,能在不是释放这把锁的情况下,再次获取这把锁。
不可重入锁指的是虽然线程当前虽然持有了这把锁,但是如果想再次获取这把锁,也必须要先释放锁才能再次尝试获取。

共享锁/独占锁

共享锁指的是我们同一把锁可以被多个线程同时获得,而独占锁指的就是这把锁只能同时被一个线程获得。我们的读写锁,就最好地诠释了共享锁和独占锁的理念。读写锁中的读锁,是共享锁,而写锁是独占锁。读锁可以被同时读,可以同时被多个线程持有,而写锁最多只能同时被一个线程持有。

公平锁/非公平锁

公平锁指的是如果现在拿不到这把锁,那么线程就会进入等待,开始排队,在等待队列里等待时间长的线程会优先拿到这把锁,有先来先得的意思。
非公平锁就不那么完美了,它会在一定的条件下,忽略掉已经在排队的线程,发生插队现象。

悲观锁/乐观锁

悲观锁的概念是在获取资源之前必须先拿到锁,以便达到独占的状态,当线程在操作资源的时候,其他线程由于拿不到锁,所以其他线程不能来影响我。
乐观锁恰恰相反,它并不要求在获取资源前拿到锁,也不会锁住资源。

自旋锁/非自旋锁

**自旋锁:**如果线程现在拿不到锁,并不直接陷入阻塞或者释放cpu资源,而是开始利用循环,不停的尝试获取锁,这个循环过程被形象的比喻成自旋,就像线程在自我旋转。
相反,非自旋锁的理念就是没有自旋的过程,如果拿不到锁就直接放弃,或者进行其他的处理逻辑。

可中断锁/不可中断锁

synchronized关键字修饰的锁是不可中断锁,一旦线程申请了锁,就没有回头路了,只能拿到锁以后才能进行其他的逻辑处理。
而我们的ReentrantLock是一种典型的可中断锁,例如使用lockInterruptibly 方法在获取锁的过程中,突然不想获取了,那么也可以在中断之后去做其他的事情,不需要一直傻等到获取到锁才离开。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值