Java多线程基础:对象内存布局和锁

Java多线程基础:Synchronized关键字

对象的内存布局

下面的讨论都是 针对HotSpot虚拟机

首先我们来了解一下对象的内存布局,对象在内存中存储的布局整体 可以分为3块区域

如上图可见呢,Mark Word 专门有2 bit 用于存储锁标志位,由于 Mark Word空间复用,存储的内容也是会变化的,如下:

Java多线程基础:对象内存布局和锁

轻量级锁

轻量级锁是JDK1.6之中新加入的新型锁机制,他的本意是 在没有多线程竞争的前提下减少传统的重量级锁使用操作系统互斥量产生 的性能消耗。即如果有两条以上的线程争用同一个锁,那轻量级锁就不再有效,要膨胀为重量级锁,即”10″。原理是, 对于绝大多数的锁,在整个同步周期内都是不存在竞争的,这是一个经验依据。

简而言之, 如果不存在竞争,那就可以避免使用互斥量,如果存在竞争,仍需要使用互斥量,且性能会较慢。

说明:需要注意的是, 轻量级锁依赖于CAS方法,即比较和交换,来更新Mark Word的内存为指向锁记录的指针。

偏向锁

偏向锁也是JDK1.6中引入的一项锁优化。目的是在 无竞争的情况下把整个同步都消除掉,包括CAS操作。这个锁会 偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他线程获取,则持有偏向锁的线程讲永远不需要进行同步。但是 一旦有另外一个线程去尝试获取这个锁时,偏向模式就宣告结束,撤销偏向后恢复到未锁定(01)或轻量级锁定(00)状态。

参考资料

  • 《深入理解Java虚拟机》

Original: https://www.cnblogs.com/MrSaver/p/13024132.html
Author: 子烁爱学习
Title: Java多线程基础:对象内存布局和锁

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538044/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 求求你们,别再刷 Star 了!这跟“爱国”没关系!

    这几年,随着几大互联网公司的强大,纷纷投入云计算产业的建设,开源项目作为维护潜在客户群体(开发者)的重要手段,是各大云计算厂商都在努力做的事。 这几年也诞生了很多真正优秀和看似优秀…

    Java 2023年6月9日
    085
  • springrain 1.1 发布,spring 的极简封装

    经过2个月的测试修改,springrain1.1已经稳定,今日发布. 主要改动如下: 1.添加批量更新和保存的方法 2.添加maven分支 3.添加博客管理的demo 4.增加re…

    Java 2023年5月30日
    075
  • 基础篇:JAVA集合,面试专用

    没啥好说的,在座的各位都是靓仔 List 数组 Vector 向量 Stack 栈 Map 映射字典 Set 集合 Queue 队列 Deque 双向队列 关注公众号,一起交流,微…

    Java 2023年6月5日
    0107
  • Java并发相关知识点梳理和研究

    知识点思维导图 (图比较大,可以右键在新窗口打开) 经典的wait()/notify()/notifyAll()实现生产者/消费者编程范式深入分析 & synchroniz…

    Java 2023年5月29日
    078
  • 权限管理系统之项目框架搭建并集成日志、mybatis和分页

    前一篇博客中使用LayUI实现了列表页面和编辑页面的显示交互,但列表页面table渲染的数据是固定数据,本篇博客主要是将固定数据变成数据库数据。 一、项目框架 首先要解决的是项目框…

    Java 2023年5月30日
    072
  • Java全家桶的这些知识,不用学了

    众所周知,Java 的知识体系繁冗复杂,但是有很多知识在实际工作中几乎没有人用。 很多人在学习过程中,却经常把有限的时间和精力花在了这些” 没有用“的知识上…

    Java 2023年6月7日
    066
  • Ajax方式上传文件报错”Uncaught TypeError: Illegal invocation”

    今天使用ajax上传文件时,出现了错误。数据传输的方式是通过定义formData完成的,提交的文件对象也设置为dom对象,但是还是不能发送请求。F12看到后台报了个错误:Uncau…

    Java 2023年6月6日
    0101
  • 第一个微信小项目

    第一个好友分析: 我们需要用到wxpy这个库,这个库用到时会弹出一个二维码,这个二维码是通过扫码的方式登录微信,以获取信息 1 #导入模块 2 from wxpy import *…

    Java 2023年6月6日
    074
  • SpringBoot入门教程,带你快速学会使用springboot

    Spring Boot 去除了大量的 xml 配置文件,简化了复杂的依赖管理,配合各种 starter 使用,基本上可以做到自动化配置。Spring 可以做的事情,现在用 Spri…

    Java 2023年6月7日
    079
  • CPU流水线与指令乱序执行

    青蛙见了蜈蚣,好奇地问:”蜈蚣大哥,我很好奇,你那么多条腿,走路的时候先迈哪一条啊?” 蜈蚣听后说:”青蛙老弟,我一直就这么走路,从没想过先迈哪…

    Java 2023年6月7日
    085
  • Java线程池 / Executor / Callable / Future

    为什么需要线程池? 每次都要new一个thread,开销大,性能差;不能统一管理;功能少(没有定时执行、中断等)。 使用线程池的好处是,可重用,可管理。 Executor 4种线程…

    Java 2023年5月29日
    067
  • 彻底消灭if-else嵌套

    一、背景 1.1 反面教材 不知大家有没遇到过像 横放着的金字塔一样的 if-else嵌套: if (true) { if (true) { if (true) { if (tru…

    Java 2023年6月5日
    090
  • springboot2.3.x whitelabel error page 404

    一般资料都提3个问题 controller 位置不对 未添加依赖 注释 我的问题是 properties 要用 thymeleaf-spring5.version Original…

    Java 2023年5月30日
    074
  • docker入门教程

    docker入门 1、简介 官网 :https://www.docker.com/ 官网文档:https://docs.docker.com/ 官网镜像:https://hub.d…

    Java 2023年6月5日
    0114
  • MySQL–写缓冲(change buffer),这次彻底懂了!!!

    转载:MySQL–写缓冲(change buffer),这次彻底懂了!!! Original: https://www.cnblogs.com/dong320/p/14…

    Java 2023年6月5日
    0103
  • 设计模式之访问者模式

    访问者模式属于行为型模式;指将作用于某种数据结构中各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访…

    Java 2023年6月5日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球