目录

背景

独占锁与共享锁

独占锁

共享锁

公平锁与非公平锁

公平锁

非公平锁

可重入锁

总结


背景

最近有一些小伙伴会问我一些关于并发相关的问题,在与他们的沟通中,我发现他们对锁的概念很模糊。这部分基础概念的缺失导致他们写的程序经常死锁,还无法bebug。虽然在网上有很多资料,但我还是用一些比较通俗易懂的例子,描述一下,帮助大家理解。

独占锁与共享锁

我发现很多人会把独占锁与公平锁搞混,其实他们不在一个方向上。

独占锁

独占锁是指在同一个时间只能有一个线程占有他,所以具备排他性。像synchronized关键字就是典型的独占锁。

举个栗子:独占锁相当于独间的澡堂,一个人进了这件澡堂,其他人都不能进,只有等他出来。

共享锁

什么是共享锁?

就是指同一时间可以被多个线程占有,像java自带的ReadWriteLock、Semaphore,他们可以设置自己共享的数量。

举个栗子:共享锁相当于一个大型公共澡堂,一开始就设定了能进去洗澡人的数量,比如是10个人,那么你要进去的时候会检查一下有没有满10个,满了你就在门口排队去吧。

公平锁与非公平锁

如果你在排队买奶茶,有个人插队了但是没人制止,你生不生气?他买到了奶茶扬长而去,这公不公平。

公平锁

公平锁就是多个线程去申请锁的使用权的时候,线程会直接进入队列排队,排在前面的可以先获得锁,排在后面的只能等着前面的先用。

举个栗子:有个澡堂,里面已经满了,后面的人想冲进去。但是有个保安站在门口,他让后面想进来的人都排好队,出来一个,就从队伍的前面放一个人进去。

没错,这就很公平。

但是公平锁也会带来其他的缺点,就是需要一个保安去控制,带来的其他开销。如果大家蜂拥而至去抢位置,少了这个保安,会更有效率。没错公平锁的缺点就是会带来更大的开销以及吞吐量下降。

非公平锁

与公平锁对应的就是非公平了,简而言之就是和公平锁反正来,什么不公平来什么。关键字synchronized就是典型的非公平锁。

缺点就是不公平,在某些场景中,特别是每次获取锁后会迅速执行并且释放锁的情况下,非公平锁是可以使用的。假设你洗澡的时间巨长,还有人插我队,这谁能忍得了?

可重入锁

可重入锁的概念很多人容易理解错,他是指同一个线程在申请到锁的情况下,继续申请锁不会阻塞,而是有个计数器记录该线程以及线程申请的次数。

举个栗子:还是单间浴室,但是我有一个洗澡卡,一旦我进了洗澡间就要刷卡,而且出来的时候还需要刷卡退出。那么我一旦进了洗澡间,我可以刷好几次进入卡,这不会阻塞住,因为都是我自己刷的。但是我退出洗澡间的时候我得刷同样次数的退出卡,不然下一个进来的人刷不了进入卡。好理解吗?你也别管我刷几次,反正我刷几次进入,就刷几次退出。

像java的关键字synchronized和ReentrantLock类都是可重入锁。

总结

希望这些简单的栗子可以帮主你理解java一些锁知识,不要把生硬的文字过度理解,跳出文字本身,设想一些生活中的场景,可以帮助我们更好的理解知识。

分享:

知识有两种,其一是我们自己精通的问题;其二是我们知道在哪里找到关于某问题的知识。                                                                                        ——约翰生

如果本文对你有用的话,请点个赞吧,谢谢!

Java 独占锁与共享锁、公平锁与非公平锁、可重入锁相关推荐

  1. Java锁的种类以及辨析(四):可重入锁

    Java锁的种类以及辨析(四):可重入锁 本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock. 可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数 ...

  2. 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】

    第二季:5值传递和引用传递[Java面试题] 前言 推荐 值传递 说明 题目 24 TransferValue醒脑小练习 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自 ...

  3. JUC - 多线程之悲观锁、乐观锁,读写锁(共享锁、独享锁),公平非公平锁,可重入锁,自旋锁,死锁(十)

    Java中主要有如下锁 一.悲观锁.乐观锁 悲观锁:当前线程去操作数据的时候,总是认为别的线程会去修改数据,所以每次操作数据的时候都会上锁,别的线程去操作数据的时候就会阻塞,比如synchronize ...

  4. 深入剖析基于并发AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/75043422 出自[zejian ...

  5. Java多线程系列——深入重入锁ReentrantLock

    简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...

  6. 可重入锁的理解及公平锁和非公平锁的具体实现

    可重入锁 首先结合以下两个例子理解以下可重入锁的概念. /*** 可重入锁:* 1.可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁.* 2.是指在同 ...

  7. java中多线程reentlock_Java多线程系列——深入重入锁ReentrantLock

    简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...

  8. java代码如何避免死锁,Java可重入锁如何避免死锁

    看到一个问题,Java的可重入锁为什么可以防止死锁呢?网上看了看资料,虽然有答案说出了正确答案,但是分析的不够详细,对初学者不够友好.这里我再做一个更清晰的分析. 首先是示例代码: 1 public ...

  9. JAVA锁之可重入锁和递归锁及示例代码

    概念:可重入锁 指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁也即是说,线程可以进入任何一个它已经拥有的锁所同步着的代 ...

  10. java可重入锁与不可重入锁

    所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的. synchronized 和   ReentrantLock 都是可重入锁. 可重 ...

最新文章

  1. 对称加密算法AES之GCM模式简介及在OpenSSL中使用举例
  2. 移动端适配方案 flexible.js
  3. 需求的推动力-网线啥的
  4. spring beans源码解读之--Bean的定义及包装
  5. oracle 多个实例互相切换实例
  6. 从零开始搭建spring-cloud(5) ----config
  7. 利用JDBC连接Oracle数据库
  8. how SAP CRM settype structure names are determined
  9. python没有错误但是不显示结果_python运行不报错又无任何结果输出
  10. 【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader
  11. keras安装不成功超时
  12. MYSQL file types redo log
  13. react-native6.0版本xcode11.2版本ios报错Unrecognized font family 'Ionicons'
  14. 用Excel利用RFM模型进行客户细分
  15. 将base64指纹编码输出为指定大小的图片
  16. 直击|支付宝还信用卡下月开始收费 每月2000免费额度
  17. ios6.0 siri语音识别
  18. 千篇一律:“外挂”泛滥的网游公关写作
  19. 2021-2027全球与中国电网级固定电池存储市场现状及未来发展趋势
  20. Mac运行越来越慢的解决办法

热门文章

  1. 手机黑卡,这个仇我是记下了
  2. 苹果 Mac OS X 系统下锁屏的快捷键
  3. 实现知乎 Android 客户端启动页视差滚动效果
  4. Python使用pymysql操作数据库
  5. Solidity智能合约开发(提高篇)
  6. 闲谈图片服务器及独立网站为什么要使用图片服务器?
  7. Buuctf-[GXYCTF2019]BabyUpload
  8. FS4412-点亮LED
  9. “三次握手,四次挥手“作为当代文明青年怎么能不会【计网】
  10. 大数据 - 统计分析平台架构介绍