Locked ownable synchronizers(转)

JVM线程分析详解 【代码】JVM线程分析详解。 阅读详情
public class DeadLock {
    public static void main(final String[] args) throws Exception {
        final Object lock1 = new Object();
        final Object lock2 = new Object();
        Thread.currentThread().setName("main-thread");
        final Thread r = new Thread("another-thread") {
            @Override
            public void run() {
                try {
                    synchronized (lock2) {
                        Thread.sleep(20000);
                        synchronized (lock1) {
                            Thread.sleep(20000);
                        }
                    }
                }
                catch (final Exception e) {
                    e.printStackTrace();
                }
            }
        };
        r.start();
        Thread.sleep(5000);
        synchronized (lock1) {
            Thread.sleep(20000);
            synchronized (lock2) {
                Thread.sleep(20000);
            }
        }
    }
}

这段代码可能有点复杂,但原理不麻烦,就是描述了经典的加锁顺序问题。栈信息比较有趣,裁剪之后如下。

"another-thread" prio=6 tid=0x02b22400 nid=0x2250 waiting for monitor entry [0x0316f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at DeadLock$1.run(DeadLock.java:14)
    - waiting to lock <0x22bc3f90> (a java.lang.Object)
    - locked <0x22bc3f98> (a java.lang.Object)

   Locked ownable synchronizers:
    - None
"main-thread" prio=6 tid=0x00868800 nid=0x2634 waiting for monitor entry [0x0098f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at DeadLock.main(DeadLock.java:28)
    - waiting to lock <0x22bc3f98> (a java.lang.Object)
    - locked <0x22bc3f90> (a java.lang.Object)

   Locked ownable synchronizers:
    - None
Found one Java-level deadlock:
=============================
"another-thread":
  waiting to lock monitor 0x02ad433c (object 0x22bc3f90, a java.lang.Object),
  which is held by "main-thread"
"main-thread":
  waiting to lock monitor 0x02ad363c (object 0x22bc3f98, a java.lang.Object),
  which is held by "another-thread"

Java stack information for the threads listed above:
===================================================
"another-thread":
    at DeadLock$1.run(DeadLock.java:14)
    - waiting to lock <0x22bc3f90> (a java.lang.Object)
    - locked <0x22bc3f98> (a java.lang.Object)
"main-thread":
    at DeadLock.main(DeadLock.java:28)
    - waiting to lock <0x22bc3f98> (a java.lang.Object)
    - locked <0x22bc3f90> (a java.lang.Object)

Found 1 deadlock.

主线程中提示了当前持有的锁和期望获取的锁,而新线程也存在类似的提示,只是获取锁的顺序不同。从栈信息可以看出,两个线程都处于BLOCKED状态。可能是源代码中的问题过于明显,导出的栈信息中给出了死锁的提示信息,实际项目的业务代码比样例要复杂,JVM可能做不到这么智能。这里的提示信息多多少少有点让我失望,在主线程栈信息的最后一部分没有输出当前持有锁的列表,很奇怪,不知道是不是和JDK的实现有关。

import java.security.SecureRandom;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

public class DeadLock {
    private final ReentrantLock lock = new ReentrantLock();
    private static final SecureRandom random = new SecureRandom();

    public DeadLock() {
    }

    public void runWork() {

        final ThreadPoolExecutor threadpool = new ThreadPoolExecutor(3, 3, 60L, TimeUnit.DAYS,
                        new SynchronousQueue<Runnable>(), new ThreadFactory() {
            private final AtomicInteger counter = new AtomicInteger(1);
            @Override
            public Thread newThread(final Runnable r) {
                return new Thread(r, "thread-sn-" + counter.getAndIncrement());
            }
        });
        threadpool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        Thread.currentThread().setName("main-thread");
        for (int i = 0; i < 15; ++i) {
            threadpool.submit(new Runnable() {
                @Override
                public void run() {
                    try {

                        int timeout = 0;
                        while ((timeout = random.nextInt()) <= 0) {
                        }
                        timeout = timeout % 111;
                        Thread.sleep(timeout * 100L);

                        lock.lock();
                        callLongTime();

                    }
                    catch (final Exception e) {
                        e.printStackTrace();
                    }
                    finally {
                        lock.unlock();
                    }
                }
            });
        }
        threadpool.shutdown();
    }

    public static void main(final String[] args) throws Exception {
        new DeadLock().runWork();
    }

    static long callLongTime() {
        System.out.println("thread name " + Thread.currentThread().getName());
        long sum = 0;
        for (long i = 0; i < 10000000000L; ++i) {
            sum = sum ^ i + i;
        }
        return sum;
    }
}

最后一个样例,写的比较复杂,但事情比较简单,线程之间的同步关键字换成了Java5提供的concurrent库中的重入锁。

"thread-sn-3" prio=6 tid=0x02de8400 nid=0x2688 runnable [0x0320f000]
   java.lang.Thread.State: RUNNABLE
    at DeadLock.callLongTime(DeadLock.java:63)
    at DeadLock$2.run(DeadLock.java:41)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
    - <0x22be1488> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
    - <0x22be66d8> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"thread-sn-2" prio=6 tid=0x02de6c00 nid=0x218c waiting on condition [0x031bf000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x22be1488> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
    at DeadLock$2.run(DeadLock.java:40)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
    - <0x22be64e0> (a java.util.concurrent.ThreadPoolExecutor$Worker)

栈信息比较有趣,JVM在每个线程线的最后部分输出了当前线程持有的锁对象,类型和地址。从上述的信息中可以找到,当前处于运行状态的线程持有了一个地址为0x22be1488的锁,而这个锁正是其它线程等待获取的锁对象。

https://blog.youkuaiyun.com/jackie_xiaonan/article/details/8577785

手把手教你用Keil5和Proteus8给51单片机跑个流水灯(附完整源码+安装包) 本文详细介绍了如何使用Keil5和Proteus8为51单片机实现流水灯效果,包括开发环境配置、汇编代码编写、电路设计及仿真调试。通过完整的源码和安装包,帮助初学者快速掌握C51单片机开发的核心流程,适合嵌入式开发入门学习。 阅读详情

相关推荐

手把手教你解决COLMAP编译中的Ceres CUDA支持问题(附详细配置步骤)

本文详细解析了COLMAP编译中Ceres CUDA支持问题的完整解决方案,包括环境准备、Ceres Solver的CUDA编译配置、COLMAP的CUDA集成配置等关键步骤。通过优化CMake参数和解决常见错误,帮助技术人员充分利用GPU加速优势,提升三维重建效率。

vodka的博客 861

死锁定位解决

死锁 死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 死锁发生的原因 死锁的发生是由于资源竞争导致的,导致死锁的原因如下: 系统资源不足,如果系统资源充足,死锁出现的可能性就很低。 进程(线程)运行推进的顺序不合适。 资源分配不当等。 死锁发生的条件 死锁的发生的四个必要条件: 互斥条件:一个资源每次只能被一个进程使用。 占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不可强行占有:进程(线

to_real的博客 3966

uniapp实战:mui-player插件如何完美适配m3u8/flv直播流(附完整代码)

本文详细介绍了如何在Uniapp中使用mui-player插件完美适配m3u8和flv直播流,提供从基础配置到高级优化的全流程解决方案。通过动态加载策略、响应式布局和内存管理,实现跨平台稳定播放,适用于企业级直播应用开发。

weixin_29001655的博客 236

并发(九):检查死锁与Locked ownable synchronizers

通过jstack可快速检查线程的死锁信息,用法如下:# 获取JVM ID(JAVA 进程ID),通过参数lv可以获取更详细的JAVA方法调用信息 jps -lv # 得到JVM ID后,执行jstack命令,这里假定为123 # 将结果重定向到文件,更便于查看 jstack -l 123 >> d:/123.txt翻到页底,可发现明显的死锁信息:Java stack information for

甘焕的博客 3万+

一文解释电路中常用电子元器件应用和选型01

电容和二极管是电路中最常用的两个电子元器件,种类和系列众多,这里简单总结一下应用场景和选型方式 电容(Capacitor) 电容的种类(20种以上)和应用非常广泛,但是我经常遇到的无非就是下面这几种: 应用 1.隔直流。 2.旁路(去耦) 3.耦合 4.滤波 5.温度补偿 6.计时 7.调谐 8.整流 9.储能 种类 1. 陶瓷电容 2. 云母电容 3. 铝电解电容 4. 钽

weixin_43904073的博客 2237

3.38 工业缺陷检测实战:物体表面缺陷检测,从图像处理到深度学习

本文介绍了工业缺陷检测的完整流程,从传统图像处理到深度学习方法。首先定义了缺陷检测任务的目标和应用场景,然后详细讲解了传统图像处理方法(边缘检测、阈值分割等)和深度学习方法(分类、检测、分割模型)。文章最后总结了核心要点,提出了思考题和实践建议,建议从简单方法开始逐步优化。下一篇将介绍工业视觉基础技术——相机标定与角点检测。

yonggeit的博客 2886

JAVA并发| 记录一次死锁(二)与Locked ownable synchronizers

package com.xiaobu.deadlock; import java.util.concurrent.*; /** * @author xiaobu * @version JDK1.8.0_171 * @date on 2019/8/21 17:16 * @description */ public class ExcuteLock { static Exec...

小布1994的博客 6426

Transformer模型详解

​本文主要介绍Transformer系列,从基础到理论,对注意力机制进行总结并解释《Attention is all you need》,提出解决sequence to sequence问题的transformer模型,用全attention的结构代替了lstm,抛弃了之前传统的encoder-decoder模型必须结合cnn或者rnn的固有模式,只用attention。文章的主要目的是在减少计算量和提高并行效率的同时不损害最终的实验结果。

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 5296

java多线程系列:死锁及检测

本文属于并发编程网多线程学习梳理系列。原文如下: 死锁 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候。 例如,如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死锁就发生了。线程1永远得不到B,线程2也永远得不到A,并且它们永远也不会知道发生了这样的事情。为了得

bohu83的博客 8740

【软件测试】- 公有云、私有云、混合云简介以及如何在公有云与私有云上分别搭建测试环境

公有云、私有云以及混合云是目前云计算领域的三种主要模式。它们之间的区别主要在于部署方式、数据访问和管理控制的不同。在阿里云或腾讯云上使用 Kubernetes 和 Docker 搭建测试环境可以提供高度的可伸缩性和灵活性。这样的环境非常适合于需要在多种配置和条件下进行测试的复杂应用。通过云服务提供的工具和服务,可以轻松管理和监控整个测试过程。在云服务上搭建测试环境涉及选择合适的云提供商、配置云资源、安装和设置所需软件等步骤。### 1. 选择云服务提供商。

weixin_46453070的博客 2342

SAPGUI excel 导出时遇到的运行时错误:STRING_SIZE_TOO_LARGE

当报表导出需求远超单一 XLSX 文件的物理承载力时,与其在 SAPGUI 中硬拼 2 GB 限制,不如把分页、过滤、流式写入作为设计前提。掌握 ABAP2XLSX 或 CSV + Power Query 等工具链,既能满足审计合规,又能让应用服务器远离的噩梦。祝你在下一次导出海量数据时,既高效又优雅。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 641

并发 九 检查死锁与Locked ownable synchronizers

并发 九 检查死锁与Locked ownable synchronizers

qq_44884577的博客 3825

嵌入式开发之瑞芯微RK356x--基本环境搭建

嵌入式环境搭建

NexyHO的博客 617

检查死锁与Locked ownable synchronizers(转载)

通过jstack可快速检查线程的死锁信息,用法如下: # 获取JVM ID(JAVA 进程ID),通过参数lv可以获取更详细的JAVA方法调用信息 jps -lv # 得到JVM ID后,执行jstack命令,这里假定为123 # 将结果重定向到文件,更便于查看 jstack -l 123 >> d:/123.txt 1 2 3 4 5 翻到页底,可发现明...

weixin_33700350的博客 1982

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

深入浅出 消息队列 ActiveMQ (转)

、概述与介绍 ActiveMQ 是Apache出品,最流行的、功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。提供客户端支持跨语言和协议,带有易于在充分支持JMS 1.1和1.4使用J2EE...

chunniyou0577的博客 139

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

线程快照实战:快速定位CPU不高但接口卡顿的JVM性能问题

在JVM性能问题排查中,线程状态与锁竞争往往是最棘手的疑难场景。线程快照(Thread Dump)作为一种轻量级采样工具,能够瞬间捕获JVM内部所有线程的执行位置、状态及锁持有关系,为定位CPU飙高、RT突增、线程池阻塞提供关键证据。通过jstack/jcmd等命令获取快照,结合nid与操作系统线程映射,可进一步追踪高CPU线程。多张快照对比、锁等待链路分析等实践手段,能帮助开发、运维与SRE从监控指标的表象深入代码层根因,快速定位慢SQL、死锁或锁持有过久等真实问题。线程快照不是万能的,但它是性能疑难杂症

weixin_34387468的博客 371

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jstack命令解析

jstack用法 /opt/java8/bin/jstack Usage: jstack [-l] <pid> (to connect to running process) 连接活动线程 jstack -F [-m] [-l] <pid> (to connect to a hung process) 连接阻塞线程...

denghonghao的博客 1900

java多线程-死锁和死锁避免

一、死锁产生的四个必要条件 二、死锁避免解决方案 三、银行家算法避免死锁 四、 一个死锁实例 五、线程运行查看工具jstack 一、死锁产生的四个必要条件 互斥条件:某个资源只能被一个进程使用,其他线程请求资源只能等待,直到当前线程释放资源(不可优化项) 占有并等待:进程已经保持一个资源,但是又提出了新要求,而这个资源被其他线程,自己保持的资源不被释放 不可枪占条件:...

makeliwei1的博客 979

Python Flask构建图书数据分析可视化系统:从爬虫到智能Agent的完整实践

数据可视化是现代数据科学和Web开发中的核心环节,它通过将复杂数据转化为直观图表,帮助用户快速理解信息模式和趋势。其技术原理通常涉及数据采集、清洗、分析及前端渲染等多个步骤,结合Python生态中的Pandas、NumPy等库进行数据处理,并利用ECharts等可视化库进行交互式展示。在工程实践中,这种技术链条的价值在于能够将原始数据转化为可操作的业务洞察,广泛应用于电商分析、内容推荐、运营监控等场景。本文以图书数据分析系统为例,具体展示了如何运用Flask框架整合爬虫技术进行数据获取,并通过引入智能体(A

weixin_34214500的博客 463

java多线程死锁的四个条件_java多线程基本概述(四)——死锁

Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.6-b01 mixed mode):"DestroyJavaVM" prio=6 tid=0x000000000096c000 nid=0x494 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNAB...

weixin_29713403的博客 687

jvm 监控和故障处理工具:jstack (2)

java命令--jstack 工具 一、介绍 jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式: jstack [-l] pid 主要分为两个功能:  a.  针对活着的进程做本...

我是谁,我在哪,我在干嘛 524

聊聊Java线程状态和常见误区

一、Java Thread文档 关于Java的线程状态,[Java Thread文档]讲的非常的清楚了,如果英文水平有4级的话,建议直接阅读文档。(https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html) 二、Java线程状态 java的线程一共有6个状态:New,Runnable,Waiting,Timed_Waiting,Blocked,Terminate。 这里Java使用Thread类的内部枚举类进行表示,我删除文档

wujingyicode的博客 350

(重点)jvm调优工具篇 - VisualVm

VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序(Java 应用程序)的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该...

cowbin2012的专栏 1万+

Java 诊断工具指南

本文介绍了Java诊断工具中的基础监控工具,包括jps、jinfo和jcmd。jps用于查看Java进程,支持显示进程ID、主类名和JVM参数;jinfo可实时查看和调整运行中Java进程的配置参数;jcmd是多功能诊断工具,支持JFR(Java飞行记录器)操作、JVM基本信息查询和内存/GC相关命令。这些工具为Java应用性能监控和问题排查提供了基础支持,能够帮助开发者快速获取进程信息、系统属性、JVM参数等关键数据,是Java应用诊断的重要工具集。

qq_48721706的博客 1302

jstack 查看死锁现象

代码: public class ServerApplication { private static class InnerTest{ public void add(){ this.add(); } private Integer a = 0; private Integer b =1; public void mockCompeteA(){ synchronized (a){

u013761206的专栏 727
上一篇: java启动命令与参数配置
下一篇: Java线程状态RUNNABLE详解
MrMoving
博客等级 码龄10年 54粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值