Java多线程锁机制相关原理实例解析

2025-05-29 0 39

上下文:程序运行需要的环境(外部变量)

上下文切换:将之前的程序需要的外部变量复制保存,然后切换到新的程序运行环境

系统调用:(用户态陷入操作系统,通过操作系统执行内核态指令,执行完回到用户态)用户态——内核态——用户态:两次上下文切换

线程wait()方法:将自身加入等待队列,发生了一次上下文切换

notify()方法:将线程唤醒,也发生了上下文切换

Java线程中的:偏向、轻量级、重量级

注意:偏向和轻量级都没有发生竞争,重量级发生了竞争。

偏向:可重入和经常使用某一个线程。

轻量级:线程之间的切换,但是未发生竞争(在一个时间段只有一个线程使用)

重量级:线程时间的竞争。

临界区:多个线程共享临界区,而且存在对临界区的读写。

Java多线程锁机制相关原理实例解析

无所状态:hashcode 31位  年龄age:4位  是否是偏向:block_lock:一位:0表示不是偏向

偏向:thread:54位 线程id  epoch 2位,作为批量重偏向的记录  biased_lock:1 表示为偏向

轻量级:ptr_to_lock_record:62位  表示,记录的指针

重量级:ptr_to_heavyweight_monitor :62位  表示monitor指针

轻量级的流程:

Java多线程锁机制相关原理实例解析

记录有两个指针:一个指向自身,一个指向lock对象,当lock对象位state位01时,表示位轻量级,此时执行轻量级的加:交换lock record和markword

重入:

Java多线程锁机制相关原理实例解析

同样创建一个LockRecord  但此时cas失败,因为此时lock对象的markword为当前记录的指针,置lockrecord指针为null,表示重入,并且添加一个重入计数器,记录重入的次数

:将LockRecord中的lockrecord(此时是markword)和lock对象(Object)中的markword(lockrecord指针)。如果解失败,那么轻量级就会膨胀为重量级

重量级的加、解、阻塞、唤醒:只有重量级有阻塞

Java多线程锁机制相关原理实例解析

如上图:当发生竞争时,新的线程会将object修改为monitor指针,指向重量级的monitor(管程),然后进入等待队列,当当前线程结束同步代码块,就会将owner置为0,此时表示没有线程拥有此,然后唤醒其他线程,其他线程就会竞争这个

偏向的加和解:新的线程只需要判断lock对象的markword对象中的线程id是否是自己的id,如果是,那么就直接使用这个。不用作cas交换,只有第一次获得此时需要用cas交换

调用hashcode可以撤销偏向,或者对同一个对象发生同步时也会撤销偏向

偏向重定向:对于一个类的多个实现类对象,当超过20次重定向时,后面该的实例对象就变成了另外一个线程的偏向

当发生40次重定向时,该类的所有lock对象就变成了轻量级

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://www.cnblogs.com/guosai1500581464/p/13413190.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java多线程锁机制相关原理实例解析 https://www.kuaiidc.com/118730.html

相关文章

发表评论
暂无评论