使用jol查看synchronized锁信息

简介: 使用jol查看synchronized锁信息

JOL

JOL 是OpenJdk发布的用查看对象在JVM中信息,全称是Java Object Layout。可以通过命令行使用。
下面例子中仅使用到了ClassLayout,有兴趣可以看看官网介绍。

pom依赖,jol 0.16版本没有使用字节码展示对象头而是直接展示了锁信息,与jstack日志一致,如果想查看对象头变化请使用 0.10版

        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.16</version>
        </dependency>

synchronization

synchronization是同步关键字,下面的示例使用synchronization+jol查看锁信息。有兴趣可以直接运行看看效果,也可以直接拖到最后看看结论或者看看oracle官方解释。

JAVA代码

import lombok.extern.slf4j.Slf4j;
import org.openjdk.jol.info.ClassLayout;

@Slf4j
public class SynchronizedDemo {

    public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();
        SynchronizedDemo demo1 = new SynchronizedDemo();
        SynchronizedDemo demo2 = new SynchronizedDemo();
        new Thread(() -> {
            demo.lockMethod();
        }).start();
        new Thread(() -> {
            demo.lockInstance(demo1);
        }).start();
        new Thread(() -> {
            SynchronizedDemo.lockStaticMethod();
        }).start();
        log.info("打印demo头信息");
        log.info(ClassLayout.parseInstance(demo).toPrintable());
        log.info("打印demo1头信息");
        log.info(ClassLayout.parseInstance(demo1).toPrintable());
        log.info("打印demo2头信息");
        log.info(ClassLayout.parseInstance(demo2).toPrintable());
        log.info("打印Class头信息");
        log.info(ClassLayout.parseInstance(SynchronizedDemo.class).toPrintable());
    }

    public synchronized static void lockStaticMethod() {
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void lockMethod() {
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void lockInstance(SynchronizedDemo demo) {
        synchronized (demo) {
            try {
                Thread.sleep(1000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

打印日志

2022-06-15 15:28:48 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : 打印demo头信息
2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : com.meijm.basis.concurrent.SynchronizedDemo object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE
  0   8        (object header: mark)     0x000000002097f050 (thin lock: 0x000000002097f050)
  8   4        (object header: class)    0xf800c105
 12   4        (object alignment gap)    
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : 打印demo1头信息
2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : com.meijm.basis.concurrent.SynchronizedDemo object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE
  0   8        (object header: mark)     0x0000000020a7ee10 (thin lock: 0x0000000020a7ee10)
  8   4        (object header: class)    0xf800c105
 12   4        (object alignment gap)    
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : 打印demo2头信息
2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : com.meijm.basis.concurrent.SynchronizedDemo object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE
  0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)
  8   4        (object header: class)    0xf800c105
 12   4        (object alignment gap)    
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : 打印Class头信息
2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : java.lang.Class object internals:
OFF  SZ                                              TYPE DESCRIPTION                    VALUE
  0   8                                                   (object header: mark)          0x000000001ba5570a (fat lock: 0x000000001ba5570a)
  8   4                                                   (object header: class)         0xf80003df
 12   4                     java.lang.reflect.Constructor Class.cachedConstructor        null
 16   4                                   java.lang.Class Class.newInstanceCallerCache   null
 20   4                                  java.lang.String Class.name                     (object)
 24   4                                                   (alignment/padding gap)        
 28   4                       java.lang.ref.SoftReference Class.reflectionData           (object)
 32   4   sun.reflect.generics.repository.ClassRepository Class.genericInfo              null
 36   4                                java.lang.Object[] Class.enumConstants            null
 40   4                                     java.util.Map Class.enumConstantDirectory    null
 44   4                    java.lang.Class.AnnotationData Class.annotationData           (object)
 48   4             sun.reflect.annotation.AnnotationType Class.annotationType           null
 52   4                java.lang.ClassValue.ClassValueMap Class.classValueMap            null
 56  32                                                   (alignment/padding gap)        
 88   4                                               int Class.classRedefinedCount      0
 92   4                                                   (object alignment gap)         
Instance size: 512 bytes
Space losses: 36 bytes internal + 4 bytes external = 40 bytes total
在代码运行时可使用jstack -l 进程id,查看具体锁信息,

结论

synchronization锁定的是JVM中运行的对象,静态方法锁定的是Class对象,代码块锁定的是括号中的对象。

参考资料

https://github.com/openjdk/jol

https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

目录
相关文章
|
7月前
|
安全 NoSQL Java
基于JWT+SpringSecurity整合一个单点认证授权机制
本文介绍了基于JWT和SpringSecurity的授权认证机制架构设计。系统采用RBAC权限模型,通过5张表描述用户-角色-权限关系。认证流程包含登录验证、IP检查、密码匹配等环节,使用JWT生成token并保存用户信息到Redis。授权部分利用@PreAuthorize注解和PermissionService实现权限校验,支持单权限、多权限及角色验证。整体架构通过过滤器链实现无状态认证,兼顾安全性和灵活性,为开发者提供了完整的认证授权解决方案。
|
Docker Windows 容器
解决 windows:An attempt was made to access a socket in a way forbidden by its access permissions
解决 windows:An attempt was made to access a socket in a way forbidden by its access permissions
4755 2
解决 windows:An attempt was made to access a socket in a way forbidden by its access permissions
|
Shell Linux 开发者
Windows下命令行使用说明
本文介绍了从Mac切换到Windows系统后,在使用命令行时遇到的换行符混乱、命令报错等问题,根源在于Windows Terminal可能随机加载PowerShell或CMD。文章梳理了CMD、PowerShell与Windows Terminal之间的关系,解释了为何相同界面下命令行为不一致,并给出CMD与PowerShell在换行符等使用上的区别,提醒用户注意环境差异,避免误操作。
1565 0
|
10月前
|
人工智能 安全 前端开发
Pydantic-DeepAgents:基于 Pydantic-AI 的轻量级生产级 Agent 框架
Pydantic-DeepAgents 是受 LangChain deepagents 启发的极简自主智能体框架,基于 Pydantic-AI 构建,强调类型安全与生产可用性。它轻量无冗余,内置 Docker 沙箱、文件操作、子智能体委托与人机协同机制,支持流式输出与 Markdown 定义能力,专为高效、安全的 AI Agent 落地而生。
1157 0
Pydantic-DeepAgents:基于 Pydantic-AI 的轻量级生产级 Agent 框架
|
10月前
|
JSON 安全 fastjson
使用阿里巴巴 Fastjson 替代 Spring Boot 默认的 Jackson
本文介绍在 Spring Boot 项目中如何替换默认的 Jackson,集成阿里巴巴 Fastjson 作为 JSON 处理框架。内容涵盖 Fastjson 与 Jackson 的核心对比、依赖配置、自定义消息转换器、null 值统一处理及循环引用控制,并提供安全建议与最佳实践,助你高效、安全地使用 Fastjson。
|
SQL Java 应用服务中间件
Apache Doris 自定义C++ UDF之流程详解(1)
Apache Doris 自定义C++ UDF之流程详解(1)
835 0
|
开发工具 git
完美解决 fatal: unable to access ‘https://github.com/.../.git‘: Could not resolve host: github.com
完美解决 fatal: unable to access ‘https://github.com/.../.git‘: Could not resolve host: github.com
36853 1
|
JSON 前端开发 Java
SpringCloud怎么搭建GateWay网关&统一登录模块
本文来分享一下,最近我在自己的项目中实现的认证服务,目前比较简单,就是可以提供一个公共的服务,专门来处理登录请求,然后我还在API网关处实现了登录拦截的效果,因为在一个博客系统中,有一些地址是可以不登录的,比方说首页;也有一些是必须登录的,比如发布文章、评论等。所以,在网关处可以支持自定义一些不需要登录的地址,一些需要登录的地址,也可以在网关处进行校验,如果未登录,可以返回JSON格式的出参,前端可以进行相关处理,比如跳转到登录页面等。
1306 4
抓包神器Charles:解析网络数据传输的秘密
Charles是一款跨平台代理工具,支持SSL代理、流量控制和网络请求截取修改,适用于Mac、Windows和Linux。它提供自动格式化的JSON或XML数据查看,便于调试。安装可从官方网站或学社下载。软件界面包含菜单栏(File、Edit、View、Proxy、Tools)和主导航栏(Structure、Sequence)。左侧视图按域名或时间排序请求,右侧显示请求详情,如Overview、Content、Summary、Chart和Notes,方便分析和记录接口信息。

热门文章

最新文章