本篇文章小编给大家分享一下Java多线程锁机制相关原理实例解析,文章介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
上下文:程序运行需要的环境(外部变量)
上下文切换:将之前的程序需要的外部变量复制保存,然后切换到新的程序运行环境
系统调用:(用户态陷入操作系统,通过操作系统执行内核态指令,执行完回到用户态)用户态——内核态——用户态:两次上下文切换
线程wait()方法:将自身加入等待队列,发生了一次上下文切换
notify()方法:将线程唤醒,也发生了上下文切换
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指针
轻量级锁的流程:
锁记录有两个指针:一个指向自身,一个指向lock对象,当lock对象位state位01时,表示位轻量级锁,此时执行轻量级锁的加锁:交换lock record和markword
锁重入:
同样创建一个LockRecord 但此时cas失败,因为此时lock对象的markword为当前锁记录的指针,置lockrecord指针为null,表示锁重入,并且添加一个锁重入计数器,记录锁重入的次数
解锁:将LockRecord中的lockrecord(此时是markword)和lock对象(Object)中的markword(lockrecord指针)。如果解锁失败,那么轻量级锁就会膨胀为重量级锁。
重量级锁的加锁、解锁、阻塞、唤醒:只有重量级锁有阻塞
如上图:当发生竞争时,新的线程会将object修改为monitor指针,指向重量级锁的monitor(管程),然后进入等待队列,当当前线程结束同步代码块,就会将owner置为0,此时表示没有线程拥有此锁,然后唤醒其他线程,其他线程就会竞争这个锁。
偏向锁的加锁和解锁:新的线程只需要判断lock对象的markword对象中的线程id是否是自己的id,如果是,那么就直接使用这个锁。不用作cas交换,只有第一次获得此锁时需要用cas交换
调用hashcode可以撤销偏向锁,或者对同一个对象发生锁同步时也会撤销偏向锁
偏向锁重定向:对于一个类的多个实现类锁对象,当超过20次重定向时,后面该锁的实例对象就变成了另外一个线程的偏向锁
当发生40次重定向时,该类的所有lock对象就变成了轻量级锁。
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整