- 再次获取锁:识别获取锁的线程是否为当前占据锁的线程 , 如果是 , 则再次成功获取 。获取锁后 , 进行计数自增 ,
- 释放锁:释放锁时 , 进行计数自减 。
可重入锁的作用: 避免死锁 。
面试题1: 可重入锁如果加了两把 , 但是只释放了一把会出现什么问题?
答:程序卡死 , 线程不能出来 , 也就是说我们申请了几把锁 , 就需要释放几把锁 。
面试题2: 如果只加了一把锁 , 释放两次会出现什么问题?
答:会报错 , java.lang.IllegalMonitorStateException 。
5、读写锁读写锁是一种技术: 通过ReentrantReadWriteLock类来实现 。为了提高性能 , Java 提供了读写锁 , 在读的地方使用读锁 , 在写的地方使用写锁 , 灵活控制 , 如果没有写锁的情况下 , 读是无阻塞的 , 在一定程度上提高了程序的执行效率 。读写锁分为读锁和写锁 , 多个读锁不互斥 , 读锁与写锁互斥 , 这是由 jvm 自己控制的 。
读锁: 允许多个线程获取读锁 , 同时访问同一个资源 。
文章插图
读锁
写锁: 只允许一个线程获取写锁 , 不允许同时访问同一个资源 。
文章插图
写锁
如何使用:
/*** 创建一个读写锁* 它是一个读写融为一体的锁 , 在使用的时候 , 需要转换*/private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
获取读锁和释放读锁// 获取读锁rwLock.readLock().lock();// 释放读锁rwLock.readLock().unlock();
获取写锁和释放写锁// 创建一个写锁rwLock.writeLock().lock();// 写锁 释放rwLock.writeLock().unlock();
Java中的读写锁:ReentrantReadWriteLock6、公平锁
文章插图
公平锁
公平锁是一种思想: 多个线程按照申请锁的顺序来获取锁 。在并发环境中 , 每个线程会先查看此锁维护的等待队列 , 如果当前等待队列为空 , 则占有锁 , 如果等待队列不为空 , 则加入到等待队列的末尾 , 按照FIFO的原则从队列中拿到线程 , 然后占有锁 。
7、非公平锁
文章插图
非公平锁
非公平锁是一种思想: 线程尝试获取锁 , 如果获取不到 , 则再采用公平锁的方式 。多个线程获取锁的顺序 , 不是按照先到先得的顺序 , 有可能后申请锁的线程比先申请的线程优先获取锁 。
优点: 非公平锁的性能高于公平锁 。
缺点: 有可能造成线程饥饿(某个线程很长一段时间获取不到锁)
Java中的非公平锁:synchronized是非公平锁 , ReentrantLock通过构造函数指定该锁是公平的还是非公平的 , 默认是非公平的 。
8、共享锁
文章插图
共享锁
共享锁是一种思想: 可以有多个线程获取读锁 , 以共享的方式持有锁 。和乐观锁、读写锁同义 。
Java中用到的共享锁: ReentrantReadWriteLock 。
9、独占锁
文章插图
独占锁
独占锁是一种思想: 只能有一个线程获取锁 , 以独占的方式持有锁 。和悲观锁、互斥锁同义 。
Java中用到的独占锁: synchronized , ReentrantLock
10、重量级锁
文章插图
重量级锁
重量级锁是一种称谓: synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的 , 监视器锁本身依赖底层的操作系统的 Mutex Lock来实现 。操作系统实现线程的切换需要从用户态切换到核心态 , 成本非常高 。这种依赖于操作系统 Mutex Lock来实现的锁称为重量级锁 。为了优化synchonized , 引入了轻量级锁 , 偏向锁 。
推荐阅读
- Javascript中类型知识和valueOf和toString()方法
- 漫长的战斗:美国人眼中的朝鲜战争 美国人眼中的朝鲜战争pdf
- 顶戴花翎中的翎有什么讲究 清朝一品官员的顶戴由什么组成
- javascript事件流
- 盘点2020JavaScript游戏框架
- Java分布式锁看这篇就够了
- 静安白茶茶中的瑰宝,黄山贡菊的功效与作用是什么
- 二 鸡肝酒的功效与作用
- 三国演义最喜欢的人物曹操 曹操和关羽是我国四大名著之一什么中的人物
- 抄袭|网易手游《时空中的绘旅人》官博喊话!《王者荣耀》再次被指抄袭