Java学习总结(1.3.1) Lock接口和其实现

精贴 置顶
1624 0
作者:      发布时间: 2020-04-03 10:11:13

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值
















标签:

每日一句

如果花了足够多的时间考虑你的目标,你就能用自己的心看到、摸到、尝到和闻到那个目标,你不会轻易放弃。实现目标的欲望会给你足够的毅力克服哪怕是最令人生畏的障碍。在真的取得成功之前,你应该已经在头脑中达成目标。这样你就能承受任何暂时的痛苦,实现自己的梦想。

标签云

vue
最近综合
情绪巨婴是什么 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