Synchronized&Lock&AQS
😊1.java锁
😊2.Synchronized锁的使用与原理
对象头:比如hash码,对象所属的年代,对象锁,锁状态标志,偏向锁(线程) ID ,偏向时间,数组长度(数组对象) 等,
💖 3.2锁的粗化:一个append方法就要加一个锁来保证线程安全,因为要做四次添加操作,jvm会优化加一个总的锁。
😊4.锁的升级过程:
(2),线程1和线程2同时访问同步代码块同时会开辟一块LockRecord空间同时复制MarkWord过来,然后线程1和线程2同时开始CAS修改,拿到执行权的线程1修改Mark Word中的指针指向地址,升级为轻量级锁,此时线程1开始执行同步体,线程2来进行第一次修改,修改失败进入自旋,如果线程1执行完逻辑代码之后,可能会自旋成功,如果自旋次数过多失败的话,先会向系统底层Pthread线程调度库,申请一个互斥量此时又会发生用户态到内核态的转变(这个过程非常耗费资源) ,申请完互斥量后会将Mark Word中的前30位指向不再指向线程1开辟的LockRecord空间,转而指向我们的重量级锁依靠底层的互斥量,之后调用Pthread库中的Pthread_mutex_loc将线程阻塞挂起,此时线程1执行完之后想要释放轻量级锁发现MarkWord中前30位被修改了,他会释放轻量级锁并且会唤醒阻塞的线程,进行新一轮的锁竞争。
💖5.3 并发包内部基本实现
这里我们说下Node。Node结点是对每一个等待获取资源的线程的封装,其包含了需要同步的线程本身及其等待状态,如是否被阻塞、是否等待唤醒、是否已经被取消等。变量waitStatus则表示当前Node结点的等待状态,共有5种取值CANCELLED、SIGNAL、CONDITION、PROPAGATE、0。
CANCELLED(1):表示当前结点已取消调度。当timeout或被中断(响应中断的情况下),会触发变更为此状态,进入该状态后的结点将不会再变化。
SIGNAL(-1):表示后继结点在等待当前结点唤醒。后继结点入队时,会将前继结点的状态更新为SIGNAL。 CONDITION(-2):表示结点等待在Condition上,当其他线程调用了Condition的signal()方法后,CONDITION状态的结点将从等待队列转移到同步队列中,等待获取同步锁。
PROPAGATE(-3):共享模式下,前继结点不仅会唤醒其后继结点,同时也可能会唤醒后继的后继结点。
0:新结点入队时的默认状态。注意,负值表示结点处于有效等待状态,而正值表示结点已被取消。所以源码中很多地方用>0、<0来判断结点的状态是否正常。
非公平就是不用进去队列,直接跟队列中的紧接着要访问同步锁的线程进行竞争,竞争成功则拿到锁执行逻辑代码,竞争失败则到队列中排队。
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的synchronized,而...
- 本文转载自并发编程网,侵删 本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓...
- 首先介绍发展史, synchronized和Lock对比表格在最后面。(其实写了之后我发现我需要复习JUC了) 1...
- 转载自:https://blog.csdn.net/fly910905/article/details/79765...