用CompletableFuture模拟死锁
将两把锁作为参数传递给MySupplier,get方法中用两个synchronized加锁,中间等待5秒
package com.test.jvm;import java.lang.management.ManagementFactory;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.Supplier;public class DeadLock
{private static Object locker1 = new Object();private static Object locker2 = new Object();private static class MySupplier implements Supplier<Void> {Object locker1, locker2;String threadName;public MySupplier(String threadName, Object locker1, Object locker2) {this.locker1 = locker1;this.locker2 = locker2;this.threadName = threadName;}@Overridepublic Void get() {Thread.currentThread().setName(threadName);System.out.println(threadName + " try to lock " + locker1);synchronized (locker1) {System.out.println(threadName + " locked " + locker1);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(threadName + " try to lock" + locker2);synchronized (locker2) {System.out.println(threadName + "locked " + locker2);}System.out.println(threadName + "released " + locker2);}System.out.println(threadName + "released " + locker1);return null;}}public static void main( String[] args ) {String pid = ManagementFactory.getRuntimeMXBean().getName();//@之前为进程IDpid = pid.substring(0, pid.indexOf('@'));System.out.println(pid);CompletableFuture<Void> future1 = CompletableFuture.supplyAsync(new MySupplier("thread1", locker1, locker2));CompletableFuture<Void> future2 = CompletableFuture.supplyAsync(new MySupplier("thread2", locker2, locker1));try {future1.get();future2.get();} catch (InterruptedException | ExecutionException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
执行结果如下:
46012
thread2 try to lock java.lang.Object@9beb73f
thread2 locked java.lang.Object@9beb73f
thread1 try to lock java.lang.Object@7ee2a9e0
thread1 locked java.lang.Object@7ee2a9e0
thread2 try to lockjava.lang.Object@7ee2a9e0
thread1 try to lockjava.lang.Object@9beb73f
两个线程得到第一把锁后都想得到对方的锁,发生死锁。
jstack dump的结果
用CompletableFuture模拟死锁相关推荐
- 哲学家进餐问题(java模拟死锁及解决方案)
一.问题描述 哲学家进餐问题是由 Dijkstra 提出并解决的,该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐.平时 ...
- 【CompletableFuture模拟真实场景之性能优化】
前言 在项目开发中,后端服务对外提供API接口一般都会关注响应时长.但是某些情况下,由于业务规划逻辑的原因,我们的接口可能会是一个聚合信息处理类的处理逻辑,比如我们从多个不同的地方获取数据,然后汇总处 ...
- mysql怎么模拟死锁_mysql 模拟产生死锁
https://blog.csdn.net/zheng0518/article/details/53844720 场景描述 在update表的时候出现DeadlockLoserDataAccessEx ...
- 在db2数据库上模拟死锁场景 还是z上的
如果条件允许,起两个线程互相抢资源就行了,但问题是,时间上还需要同步,要做到完美控制,还得加其他逻辑,忒费事,所以可以用下面的办法: 在目标表上直接加个锁--简单,粗暴,直接--很好-- LOCK T ...
- CSS应用:复杂背景图案
通过线性渐变和通过径向渐变可以容易的构造出条纹背景(如果你还对线性渐变和径向渐变不了解,请参考我前面的文章线性渐变和径向渐变,你也可以在遇到困难的时候再去查阅),但他们能做的事情远不止于此,使用他们能 ...
- Oracle“死锁”模拟
本着实验优先的原则,先模拟死锁的发生,然后在列一下死锁产生的四个必要条件和处理死锁的一般策略. 1.创建两个简单的表t1_deadlock和t2_deadlock,每个表中仅仅包含一个字段a sys@ ...
- Java线程死锁模拟
本文由广州疯狂软件java培训分享: 1,关于死锁的理解 死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况. 2,模拟死锁 背景介绍:我们创建一 ...
- 手把手教你分析MySQL死锁问题,十分钟看完文章下次轻松完成不加班
发生死锁了,如何排查和解决呢?本文将跟你一起探讨这个问题 准备好数据环境 模拟死锁案发 分析死锁日志 分析死锁结果 环境准备 数据库隔离级别: mysql> select @@tx_isolat ...
- 一次诡异的数据库死锁问题排查过程
GitHub 1.8k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 1.8k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 1.8k Star 的 ...
最新文章
- 【博客美化】公告栏显示个性时间
- Emacs Org-mode学习笔记
- VS为VC++添加UAC控制(VC程序默认管理员运行)
- AdminLTE组件之表格DataTable
- C 语言指针 5 分钟教程
- nRF52832 中断相关
- python使用@property @x.setter @x.deleter
- wp7技术类网站汇总
- 媒体服务器协议,媒体服务器介绍(mediactrl架构)
- 灰度共生矩阵及其数字特征_数字系统及其表示
- Java使用ttf字体下载网站
- 关于COM类工厂80070005和8000401a错误分析及解决办法
- HDU2177——取(2堆)石子游戏(威佐夫博弈)
- url转码解码工具类
- STM32串口驱动(拼音检索测试通过)(环形队列+内存动态分配+DMA)
- java 模块解耦_微服务架构:如何用十步解耦你的系统?
- 2010 ACR/EULAR 类风湿关节炎分类标准的应用:针对非常早期的滑膜炎患者与1987年ACR标准的比较...
- 区块链应用开发(智能合约的开发和WeBASE合约IDE的使用)
- java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must b
- 【论文阅读】 VL-BERT: Pre-training of generic visual-linguistic representations
热门文章
- Cannot insert explicit value for identity column in table xxx when IDENTITY_INSERT is set to OFF
- Openwrt中MT7628/MT7688的全部GPIO复用配置及常用接口
- IntelliJ IDEA 远程激活服务器搭建教程
- MQ测试:发出第一条MQ消息
- 世界上最健康的生活方式
- 英方软件IPO过会:年营收1.6亿 拟募资5.7亿
- XV6 Network解析-1
- [网络安全学习篇23]:DNS欺骗与钓Y网站(千峰网络安全视频笔记 p114-p116)
- iPhone开发入门(10)— 设备上运行程序
- 卓训教育案例分析:不同的教育方式,不同的教育效果