Java学习总结(1.3.1) Lock接口和其实现
synchronized(this)
加锁状态记录到在对象头的Mark Word里面。
若锁占用,线程挂起,释放锁时,唤醒挂起的线程,是如何做到的?
堆当中的引用的对象头上信息。
对象头: Mark Word 、Class Meta Address、Array lenth
ps: 线程加锁,不是对象加锁
Lock的本质
加锁是对资源的限制。
抢锁是获得资源的访问权限 。
synchronized -> JVM
Lock-> JDK
Locks包 类层次结构
ReentrantReadWriteLock(impl) -> ReentrantLock (impl)-> Lock接口
ReentrantReadWriteLock下
ReadLock WriteLock (impl) -> Lock接口
Lock接口
void lock() 获取锁(不死不休)(阻塞)
boolean tryLock() 获取锁(浅尝辄止)(不阻塞)
boolean tryLock(long time, TimeUnit unit) throws InterruptedException 获取锁(任人摆布)(有时间的阻塞)
void unlock() 释放锁
Condition newCondition();
Condition
Objecti中的wait0、 notify()、 notify)只能和 synchronized配合使用,可以唤醒一个或者全部(单个等待集);
Condition需要与Lock配合使用的,提供多个等待集合,更精确的控制;
线程 Waitset等待池
必须和 Synchronized一起使用,在获取锁之后才能执行
wait 挂起线程、将锁释放
notify 将线程唤醒 你并不知道 notify唤醒的是哪个线程
Condition就是Lock的等待池
Lock Reentrantlock,必须在获取锁之后才能够执行
Condition. await()挂起
condition. signa1()唤醒
Synchronized vs Lock
Synchronized优点:
1、使用简单,语义清晰,哪里需要点哪里。
2、由JVM提供,提供了多种优化方案(锁粗化、锁消除、偏向锁、轻量级锁
3、锁的释放由虚拟机来完成,不用人工干预,也降低了死锁的可能性缺点、无法实现一些锁的高级功能如:公平锁、中断锁、超时锁、读写锁、共享锁等
Lock
优点:
1、所有 synchronized的缺点
2、可以实现更多的功能,让 synchronized缺点更多
结论: synchronized是卡机,Lock是单反
ReadWirteLock
概念:维护一对关联锁,一个只用于读操作,一个只用于写操作;读锁可以由多个读线程同时持有,写锁是排他的。同一时间,两把锁不能被不同线程持有。
适用场景:适合读取操作多于写入操作的场景,改进互斥锁的性能,比如:集合的并发线程安全性改造、缓存组件。
锁降级:指的是写锁降级成为读锁。持有写锁的同时,再获取读锁,随后释放写锁的过程。写锁是线程独占,读锁是共享,所以写>读是降级。(读>写,是不能实现的)
AQS就是一个模板,包含了很多公共的业务逻辑。留白了方法,给用户去实现。
业务方面来的剖析:
抽象以列同步器,AQS就是用来排队的,让线程排队,处理放到队列中,线程的状态需要维护。
为了让线程排队,就做了很多的业务封装,最后形成模板,就是AQS
Readwritelock用一个int存储了两个 count值
- 上一篇: Java学习总结(1.2.3) Java锁相关
- 下一篇: Java学习总结(1.3.2) 并发容器类
每日一句
博客分组
标签云
- 最近综合
- 情绪巨婴是什么 12.18
- 普通蛋糕做法 05.31
- 玉米烤肠芝士面包做法 05.31
- Mysql安装教程 - 绿色版 06.18
- 我们学习知识为什么总是忘记呢?【学习金字塔】 05.12
- Typora开发版⽆法使⽤解决⽅法 05.04
- 为什么无知者越自信? -- 达克效应 05.10
- 马斯洛需求层次理论 04.29
- 随机综合
- Zebra斑马 888-TT打印机的EPL命令的详细说明 08.31
- Java学习总结(1.3.4) 并发工具类详解 04.15
- 电商运营主要做什么? 10.08
- 中间件1.3.1-RabbitMQ入门及内部消息分发机制 04.29
- 中间件1.1.1-分布式消息中间件设计篇 04.22
- [vue]VUE的一些问题和解决 08.05
- Java学习总结(1.3.3) 并发容器类2 04.09
- Java学习总结(1.1.4) 内存屏障和CPU缓存 03.18