将两把锁作为参数传递给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模拟死锁相关推荐

  1. 哲学家进餐问题(java模拟死锁及解决方案)

    一.问题描述 哲学家进餐问题是由 Dijkstra 提出并解决的,该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐.平时 ...

  2. 【CompletableFuture模拟真实场景之性能优化】

    前言 在项目开发中,后端服务对外提供API接口一般都会关注响应时长.但是某些情况下,由于业务规划逻辑的原因,我们的接口可能会是一个聚合信息处理类的处理逻辑,比如我们从多个不同的地方获取数据,然后汇总处 ...

  3. mysql怎么模拟死锁_mysql 模拟产生死锁

    https://blog.csdn.net/zheng0518/article/details/53844720 场景描述 在update表的时候出现DeadlockLoserDataAccessEx ...

  4. 在db2数据库上模拟死锁场景 还是z上的

    如果条件允许,起两个线程互相抢资源就行了,但问题是,时间上还需要同步,要做到完美控制,还得加其他逻辑,忒费事,所以可以用下面的办法: 在目标表上直接加个锁--简单,粗暴,直接--很好-- LOCK T ...

  5. CSS应用:复杂背景图案

    通过线性渐变和通过径向渐变可以容易的构造出条纹背景(如果你还对线性渐变和径向渐变不了解,请参考我前面的文章线性渐变和径向渐变,你也可以在遇到困难的时候再去查阅),但他们能做的事情远不止于此,使用他们能 ...

  6. Oracle“死锁”模拟

    本着实验优先的原则,先模拟死锁的发生,然后在列一下死锁产生的四个必要条件和处理死锁的一般策略. 1.创建两个简单的表t1_deadlock和t2_deadlock,每个表中仅仅包含一个字段a sys@ ...

  7. Java线程死锁模拟

    本文由广州疯狂软件java培训分享: 1,关于死锁的理解 死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况. 2,模拟死锁 背景介绍:我们创建一 ...

  8. 手把手教你分析MySQL死锁问题,十分钟看完文章下次轻松完成不加班

    发生死锁了,如何排查和解决呢?本文将跟你一起探讨这个问题 准备好数据环境 模拟死锁案发 分析死锁日志 分析死锁结果 环境准备 数据库隔离级别: mysql> select @@tx_isolat ...

  9. 一次诡异的数据库死锁问题排查过程

    GitHub 1.8k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 1.8k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 1.8k Star 的 ...

最新文章

  1. 【博客美化】公告栏显示个性时间
  2. Emacs Org-mode学习笔记
  3. VS为VC++添加UAC控制(VC程序默认管理员运行)
  4. AdminLTE组件之表格DataTable
  5. C 语言指针 5 分钟教程
  6. nRF52832 中断相关
  7. python使用@property @x.setter @x.deleter
  8. wp7技术类网站汇总
  9. 媒体服务器协议,媒体服务器介绍(mediactrl架构)
  10. 灰度共生矩阵及其数字特征_数字系统及其表示
  11. Java使用ttf字体下载网站
  12. 关于COM类工厂80070005和8000401a错误分析及解决办法
  13. HDU2177——取(2堆)石子游戏(威佐夫博弈)
  14. url转码解码工具类
  15. STM32串口驱动(拼音检索测试通过)(环形队列+内存动态分配+DMA)
  16. java 模块解耦_微服务架构:如何用十步解耦你的系统?
  17. 2010 ACR/EULAR 类风湿关节炎分类标准的应用:针对非常早期的滑膜炎患者与1987年ACR标准的比较...
  18. 区块链应用开发(智能合约的开发和WeBASE合约IDE的使用)
  19. java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must b
  20. 【论文阅读】 VL-BERT: Pre-training of generic visual-linguistic representations

热门文章

  1. Cannot insert explicit value for identity column in table xxx when IDENTITY_INSERT is set to OFF
  2. Openwrt中MT7628/MT7688的全部GPIO复用配置及常用接口
  3. IntelliJ IDEA 远程激活服务器搭建教程
  4. MQ测试:发出第一条MQ消息
  5. 世界上最健康的生活方式
  6. 英方软件IPO过会:年营收1.6亿 拟募资5.7亿
  7. XV6 Network解析-1
  8. [网络安全学习篇23]:DNS欺骗与钓Y网站(千峰网络安全视频笔记 p114-p116)
  9. iPhone开发入门(10)— 设备上运行程序
  10. 卓训教育案例分析:不同的教育方式,不同的教育效果