Java并发编程- Synchronized原理

芯片设计中的STA实战:如何避免时序违例(含常见问题解析) 本文深入探讨了芯片设计中静态时序分析(STA)的实战应用,重点解析了如何避免时序违例。文章从STA的核心逻辑与约束制定出发,强调了将时序意识植入RTL编码与综合阶段的重要性,并详细介绍了后端物理实现中的时序收敛策略。同时,针对跨时钟域路径误报、多工艺角违例等常见问题提供了深度解析与调试技巧,旨在帮助IC设计工程师系统性地掌握时序分析与优化方法。 阅读详情

Java并发编程- Synchronized原理

在jdk.1.6之前是重量级锁,jdk1.6之后对synchronzied的关键字的优化之后,引入了偏向锁,轻量级锁。

1.先来看synchronzied使用的基础:

static  A a = new A();

//普通同步方法
public synchronized void test(){
    System.out.println("锁的是当前对象实例");
}
//静态同步方法
public static synchronized void test1(){
    System.out.println("锁的是当前类的Class对象");
}
//同步方法块
public   void test2(){
    synchronized (a){
        System.out.println("锁的是括号里配置的对象");
    }
}

2. synchronzied使用的锁在哪呢?存在对象头里,

整个对象存储情况,运行代码查看结果分析:

public class A {

    private boolean b;
}
public class Test {
    static  A a = new A();
    public static void main(String[] args) {
        System.out.println(VM.current().details());
        System.out.println(ClassLayout.parseInstance(a).toPrintable());
    }
}

运行结果分析:

分析:对象一共16B,其中12B是对象头,1B是对象实例数据,3B是字节对齐

对象的长度

长度内容说明
12B对象头存储信息,hashcode,年代信息等。
1B对象实例数据存储对象的实例数据
3B字节对齐 

对象头12B存储哪些内容呢?64位的VM

可以从openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html 官网上看到,存储的内容是mark word 和klass word

java对象头的长度

长度内容说明
8Bmark word存储着锁的信息,hashcode,gc信息等等
4Bklass word 指向对象的元数据

java对象头的结构

无锁的对象头如下:

第一个字节的前8位存储着,分代年龄4个bit,锁的标识2个bit,是否偏向1个bit,和没有使用的1个bit。

其他的7个字节存储着hashcode信息。

锁状态56bit4bit1bit是否偏向锁2bit锁的标识
无锁对象hashcode对象分代年龄001

我们知道对象的状态一共五种状态:无锁,偏向锁,轻量级锁,重量级锁,gc标记的锁。

3. 偏向锁

概念:同一个线程多次获取同一把锁。(只有一个线程调用同步块)

代码:

public class Test {
    static  A a ;
    public static void main(String[] args) {
        Thread.sleep(5000);//jvm 延时启动偏向锁,是默认4s之后开启,可以设置关闭延时。因为启动的时候就使用偏向锁,比较消耗性能,升级锁比较费时间。

        System.out.println(VM.current().details());
        a = new A();
        System.out.println(ClassLayout.parseInstance(a).toPrintable());
        syn();
            System.out.println(ClassLayout.parseInstance(a).toPrintable());
    }
    public static  synchronized  void syn(){
        System.out.println("演示偏向锁-----------");
    }
}

输出结果:

演示偏向锁-----------

 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           80 22 01 f8 (10000000 00100010 00000001 11111000) (-134143360)
     12     1   boolean A.b                                       false
     13     3           (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total

分析结果:程序只有一个线程main调用syn方法,因此是偏向锁,也可以使用-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0禁用延时。-XX:+TraceClassLoading (跟踪加载)

4. 轻量级锁:线程交替运行,无竞争。

public class Test {
    static  A a ;
    public static void main(String[] args) throws InterruptedException {
      //  System.out.println(VM.current().details());
        a = new A();
        System.out.println(ClassLayout.parseInstance(a).toPrintable());
        syn();
        System.out.println(ClassLayout.parseInstance(a).toPrintable());

    }
    public static    void syn(){
        synchronized (a){
            out.println("lock ing");
            System.out.println(ClassLayout.parseInstance(a).toPrintable());
        }
    }
}

运行结果:
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           43 c1 00 f8 (01000011 11000001 00000000 11111000) (-134168253)
     12     1   boolean A.b                                       false
     13     3           (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total

lock ing
com.luban.wf.A object internals:
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           a0 f5 e7 02 (10100000 11110101 11100111 00000010) (48756128)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           43 c1 00 f8 (01000011 11000001 00000000 11111000) (-134168253)
     12     1   boolean A.b                                       false
     13     3           (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total

com.luban.wf.A object internals:
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           43 c1 00 f8 (01000011 11000001 00000000 11111000) (-134168253)
     12     1   boolean A.b                                       false
     13     3           (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total


Process finished with exit code 0
 

分析结果:lock ing 输出的10100000 轻量级锁。

 

5. 重量级锁:

public class Test2 {
    static  A a ;

    public static void main(String[] args) throws InterruptedException {
        a = new A();
        System.out.println("before lock");
        out.println(ClassLayout.parseInstance(a).toPrintable());//轻量锁

        Thread t1 = new Thread(new Runnable() {
            public void run() {
                synchronized (a){

                    synchronized (a){
                        System.out.println("before wait");
                        out.println(ClassLayout.parseInstance(a).toPrintable());//轻量锁
                        try {
                            a.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("after wait");
                        out.println(ClassLayout.parseInstance(a).toPrintable());//重量级锁
                    }
                }
            }
        });

        t1.start();

        Thread.sleep(5000);
        synchronized (a){
            a.notifyAll();//唤醒线程t1
        }

    }


}

运行结果:


before lock
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           43 c1 00 f8 (01000011 11000001 00000000 11111000) (-134168253)
     12     1   boolean A.b                                       false
     13     3           (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total

before wait
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           a0 f2 7b 1c (10100000 11110010 01111011 00011100) (477885088)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           43 c1 00 f8 (01000011 11000001 00000000 11111000) (-134168253)
     12     1   boolean A.b                                       false
     13     3           (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total

after wait
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           da d7 e2 19 (11011010 11010111 11100010 00011001) (434296794)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           43 c1 00 f8 (01000011 11000001 00000000 11111000) (-134168253)
     12     1   boolean A.b                                       false
     13     3           (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total


Process finished with exit code 0
 

运行结果分析:after wait  的为11011010 重量级锁

 

 

 

6. 偏向锁的批量撤销:

 

 

 

7. 轻量级锁的膨胀过程:

 

 

 

 

 

 

 

 

8.总结:

锁有哪几种:公平锁和非公平锁(线程获取锁的机会不是均匀的)

工作当中怎样选择锁:

Synchronized 是有sun公司实现的 jvm内部调用操作系统实现的

1.是个非公平锁,

2.使用简单,

3.经过优化了,偏向锁,轻量级锁,重量级锁

lock jdk实现的:

1.是个公平锁,

2.需要手动释放锁

3.如果要实现高级功能,可以使用

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SAP_MM模块非限制库存转冻结库存 项目非限制 → 冻结事务码移动类型343影响库存不可用,不参与MRP常见用途质量问题封存、盘点冻结、待退货品通过本文,我们了解了 SAP 的[SAP_MM模块非限制库存转冻结库存]的基本概念和应用方法。希望这些信息能帮助您在实际工作中更好地使用 SAP 系统,提高工作效率和管理水平。更多SAP文章请点击更多SAP文章更新,大家一起学习进步!!!文章中如有错误。敬请指正!搜索公众号:SAP资料文库微信号:SPRO_PP时间:2025-10-14。 阅读详情

相关推荐

【计算机三级-数据库技术】操作题大题(第1套)

从触发器的语法中可知,【1】处应该填写的是执行触发器的表,【2】处应该填写指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。使用FOR或AFTER选顶定义的触发器为后触发器,即只有在引发触发器执行的语句中的操作都已成功执行,并且所有的约束检查也成功完成后,才执行触发器。转换成新的独立的模式,模式的属性由联系本身的属性及两个实体的键构成,主键由两端实体的键组合而成。实体的转换:在从ER图转换为关系模式时,一个实体转换成一个关系模式,实体的属性就是关系模式的属性,实体的键就是关系的主键。

放纵小开爱的博客 1103

java查看对象真实地址和哈希值的工具类

HotSpot JVM 中有不同的压缩引用模式。因此,我们不应该根据该地址执行一些本机内存操作,因为它可能会导致奇怪的内存损坏。hashCode()方法是所有 Java 对象的常用方法之一。有一种常见的误解,认为 JVM 中对象的内存地址是作为其默认 toString 实现的一部分表示的,例如。此外,大多数 JVM 实现中的内存地址会随着 GC 不时移动对象而发生变化。可以查看对象未被重写的hashcode值;在JVM中查找特定对象的内存地址;也就是说,许多人认为这里的。是该特定对象的内存地址。...

进击的豌豆的博客 2623

生物信息学投稿避坑指南:如何根据影响因子和审稿速度选择最适合的期刊

本文为生物信息学研究者提供全面的期刊投稿策略,重点解析影响因子、审稿速度等关键指标,帮助选择最适合的期刊。涵盖算法开发类和应用型研究的投稿路径,分析不同出版社特点及开放获取的利弊,并提供投稿全流程优化建议,助力高效发表研究成果。

weixin_42652674的博客 380

多线程四 并发中锁的原理

本文分析了Java对象锁的机制与实现,重点探讨了对象头中的Mark Word结构及其在不同锁状态下的变化。通过OpenJDK的JOL工具,详细解析了无锁(001)、偏向锁(101)、轻量级锁(000)和重量级锁(010)四种状态的标识位布局。实验表明:偏向锁在单线程场景下性能最优,计算hashcode后会失去偏向能力,调用wait()方法会直接升级为重量级锁,而持续竞争则会触发锁膨胀机制。文章还比较了不同锁状态下的性能差异,为理解Java并发编程中的锁优化提供了实用参考。

用针戳左手中指指头的博客 636

xctf攻防世界 MISC高手进阶区 low

1. 进入环境,下载附件 给出的一张bmp图片,没有其他信息 2. 问题分析 扔进binwalk中,没有发现有用信息 使用zsteg,没有有用信息 塞入StegSolve中,发现有点猫腻,如图: 有点二维码的感觉,emmm,需要像素处理,但不知道如何下手,参考网上的wp,发现是让使用lsb隐写,copy代码: from PIL import Image img = Image.open('./pic/low.bmp') img_tmp = img.copy() pix = img_tmp.load()

l8947943的博客 1万+

06-esp32-idf开发调试方法(内置JTAG,OpenOCD调试)

使用VS Code和ESP-IDF进行ESP32开发和调试 在我们搭建 **IDF** 框架后,**OpenOCD** 已经自动下载好了, 我们通过 **JTAG** 接口连接使用 **OpenOCD** 进行调试。而**ESP32**芯片中内置 了**JTAG** 电路,无需额外芯片即可调试,更加方便,所以这里我们讲解使用模块自带的usb-jtag接口进行调试。

宁子希的博客 1万+

深入理解Java对象结构

一、Java对象结构 实例化一个Java对象之后,该对象在内存中的结构是怎么样的?Java对象(Object实例)结构包括三部分:对象头、对象体和对齐字节,具体下图所示 1、Java对象的三部分 (1)对象头 对象头包括三个字段,第一个字段叫作Mark Word(标记字),用于存储自身运行时的数据,例如GC标志位、哈希码、锁状态等信息。 第二个字段叫作Class Pointer(类对象指针),...

weixin_36968890的博客 585

MOLDFLOW 2012模流分析基础到实战视频教程

├ 1第一讲MF软件安装与界面定制及模流前期准备工作及分析流程介绍 ├ 2第二讲MF建模工具条命令讲解与图层的运用 ├ 3第三讲MF网格类型与适应范围及网格划分、诊断、修复与统计 ├ 4第四讲MF中CAD doctor 模块对导入模型的修复方法与实例 ├ 5第五讲MF中常见各种流道浇口及水路的建模方法与外部导入方法上 ├ 6第六讲MF产品模型导入CAD DOCTOR与修复 ├ 7第七讲MF分析序列设定与网格的划分与诊断及修复 ├ 8第八讲MF材料选择与成型工艺参数设定 ├ 9第九讲MF创建浇注系统:主流道、

QQ_1987083845的博客 2547

学习小记 -- Java对象内存布局之理解

根据Java虚拟机的规范:Java对象分为对象头(Object Header), 实例数据(instance data),对齐填充(padding)。如图:

weixin_42029860的博客 535

RK806S PMIC电源管理芯片调试

当点按PWRON按键时,rk806上电开始启动bootloader和uboot,在执行到此处时检测到是由于按键启动的,所以0x5d的值是0x80,0x74的值是0x80,在一般情况下,mode都默认是none的,所以mode值为11,因此就进入了我们的if判断,若是由于按键启动的,则直接调用rk8xx_shutdown函数关掉,进入这个函数会看到实际是通过i2c给0x72寄存器的BIT(0)写1,使其关机。当SoC在12V电源已经接入,且处于关机状态时,使用PWRON按键开机,0x74的值则为0x80。

Y1anoohh的博客 2546

论文阅读:arxiv 2023 EduChat: A Large-Scale Language Model-based Chatbot System for Intelligent Education

EduChat是一个基于大规模语言模型(LLM)的教育领域聊天机器人系统,旨在为教师、学生和家长提供个性化、公平且富有同理心的智能教育服务。该系统通过在教育语料库上进行预训练和特定任务微调,强化了开放式问答、作文评估、苏格拉底式教学和情感支持等教育功能。为解决领域知识不足和知识更新问题,EduChat采用了检索增强技术,并融入心理学和教育学理论。该项目已开源,提供代码、数据和模型参数,推动LLM在智能教育中的应用发展。

CSPhD-winston的博客 1039

Java获取对象的内存地址

前言 我们知道在Java中对于synchronized对于同步方法锁的是当前的实例对象。 例如以下这段代码: import java.util.concurrent.TimeUnit; public class Test { public static void main(String[] args) { Test test = new Test(); test.helper(); } public synchronized void helper

与望 6486

Arduino、ESP32驱动TEMT6000传感器(光照传感器篇)

TEMT6000是一个三极管类型的光敏传感器,其光照强度和基极的电流成正比。用起来也相当简单,可以简单的连接该传感器的基极到模拟电压输入,通过简单的检测电压值就可以判断当前的光照强度。

不脱发的程序猿 4236

【Java并发编程】描述常见的锁策略、CAS在Java中的实现以及 Synchronized 的加锁原理

描述常见的锁策略、描述CAS的原理以及在Java中有哪些实现、描述Java中 synchronized的基本特点和加锁原理。

yican2580的博客 2079

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java并发编程:Synchronized及其实现原理

Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁、偏向锁) Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) Java 并发编程:volatile的使用及其原理 一、Synchronized的基本使用 Synchronized是Jav...

liuhui12345的博客 188

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java并发编程之synchronized原理

Java并发编程之synchronized原理(二) Java中的每一个对象都可以作为锁,变现方式为: 对于普通同步方法,锁是当前实例对象。 对于静态同步方法,锁是当前类的Class对象。 对于同步方法块,锁是Synchonized括号里配置的对象。 普通同步方法: publicsynchronizedvoidhello() { } 静态同步方法 Publicsta...

weixin_44416039的博客 236

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java 并发编程深度解析:synchronized 关键字的内部原理与应用

synchronized 锁的底层原理

码上一元 1546

Java并发编程之volatile和synchronized原理

Java并发编程之volatile和synchronized原理

csdn15917204572的博客 833

java synchronized底层原理_Java 并发编程:Synchronized 及其实现原理

点击上方“linkoffer”,选择关注公众号高薪职位第一时间送达作者:liuxiaopeng原文链接:www.cnblogs.com/paddix/p/5367116.html一、Synchronized的基本使用Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证...

weixin_35850669的博客 90

Java并发编程-深入探讨synchronized实现原理

synchronized这个关键字对应Java程序猿来说是非常的熟悉,只要遇到要解决线程安全问题的地方都会使用这个关键字。接下来一起来探讨一下synchronized到底时怎么实现线程同步,使用synchronized实现线程同步到底好不好。 在讨论synchronized之前,是否大家对cup怎么实现多线程是否有所了解? 上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线...

码农博士的博客 284

Java 并发编程一篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)

一、基本概念 1、进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等) 线程 一个进程之内可以分为一到多个线程

qq_40820563的博客 628

深入解析Java并发编程:synchronized锁升级全路径与核心原理

在多线程编程的世界中,共享资源的并发访问控制始终是开发者面临的核心挑战。Java语言从诞生之初就内置了synchronized关键字作为其最基础的线程同步机制,这一设计选择体现了Java对并发安全问题的根本性解决方案。随着Java版本的演进,synchronized的实现机制经历了多次重大优化,从最初简单的重量级锁逐步发展为包含偏向锁、轻量级锁和重量级锁的复杂锁升级体系。在探索Java并发编程的旅程中,我们系统地拆解了synchronized锁从偏向锁到重量级锁的完整升级路径。

zuiyuelong的博客 949

Java 并发编程上篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)

一、基本概念 1、进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等) 线程 一个进程之内可以分为一到多个线程

雾里 2万+

JAVA面试宝典-《并发编程必考:synchronized与AQS原理》

本文深入解析Java并发编程中的两种核心同步机制:synchronized和AQS。首先通过银行转账等案例说明线程安全的重要性,详细剖析synchronized的使用方式及其底层实现原理,包括偏向锁、轻量级锁和重量级锁的升级过程。然后解读AQS框架的核心机制,包括状态管理、CLH队列和加解锁流程,并给出自定义锁实现案例。最后对比两者的实现方式、性能特点和使用场景,提供常见面试问题解答,建议根据实际需求合理选择同步方案,掌握这些技术对开发高性能并发程序至关重要。

qq_43414012的博客 1081
上一篇: Java并发编程- CyclicBarrier用法
下一篇: Java并发编程- CAS原理
wflovejava
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值