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

 更新时间:2020年08月01日 11:10:51   作者:七月在野,八月在宇  
这篇文章主要介绍了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对象就变成了轻量级锁。

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

相关文章

  • 解决@Autowired注入static接口的问题

    解决@Autowired注入static接口的问题

    这篇文章主要介绍了解决@Autowired注入static接口的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java 如何使用正则表达式去除前导0

    Java 如何使用正则表达式去除前导0

    这篇文章主要介绍了Java 使用正则表达式去除前导0的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Java迭代器与Collection接口超详细讲解

    Java迭代器与Collection接口超详细讲解

    Collection也称集合,集合概述:集合是Java中提供的一种容器,可以用来存储多个数据。Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合
    2022-07-07
  • 浅谈SpringMVC请求映射handler源码解读

    浅谈SpringMVC请求映射handler源码解读

    这篇文章主要介绍了浅谈SpringMVC请求映射handler源码解读,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • JavaWeb ServletContext基础与应用详细讲解

    JavaWeb ServletContext基础与应用详细讲解

    ServletConfig对象,叫Servlet配置对象。主要用于加载配置文件的初始化参数。我们知道一个Web应用里面可以有多个servlet,如果现在有一份数据需要传给所有的servlet使用,那么我们就可以使用ServletContext对象了
    2023-01-01
  • Java如何从Redis中批量读取数据

    Java如何从Redis中批量读取数据

    这篇文章主要介绍了Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • jstl标签基础开发步骤(详解)

    jstl标签基础开发步骤(详解)

    下面小编就为大家带来一篇jstl标签基础开发步骤(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java中Hutool克隆功能的使用

    Java中Hutool克隆功能的使用

    本文主要介绍了Java中Hutool克隆功能的使用,cn.hutool.core.clone.Cloneable 是Hutool中提供的一个接口,用于支持对象的深度克隆操作,下面就一起来介绍一下
    2024-04-04
  • Spring Data JPA 在 @Query 中使用投影的方法示例详解

    Spring Data JPA 在 @Query 中使用投影的方法示例详解

    这篇文章主要介绍了Spring Data JPA 在 @Query 中使用投影的方法,大家需要注意如果要在 @Query 中使用投影,必须要主动声明要查询的字段,并且主动写明字段的别名才行,本文通过sql代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-07-07
  • java开发ExecutorService监控实现示例详解

    java开发ExecutorService监控实现示例详解

    这篇文章主要为大家介绍了java开发ExecutorService监控实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论