构造几个死锁的例子(Java )
构造几个死锁的例子(Java )
1
public class Deadlock {
public static void main(String[] args) {
final A a1 = new A("a1");
final A a2 = new A("a2");
a1.setA(a2);
a2.setA(a1);
Thread t1 = new Thread(()->{
a1.method1();
});
Thread t2 = new Thread(()->{
a2.method1();
});
t1.start();
t2.start();
}
}
class A {
String name;
A a;
public A(String name) {
this.name = name;
}
public void setA(A a) {
this.a = a;
}
synchronized void method1() {
System.out.println(Thread.currentThread().getName() + ": 锁住了" + name);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 我在等待" + a.name);
a.method2();
}
synchronized void method2() {
System.out.println(Thread.currentThread().getName() + ": 我得到了" + name);
System.out.println(Thread.currentThread().getName() + ": " + name + "." + a.name + ".method2()");
}
}
运行结果:

2
public class Deadlock {
public static void main(String[] args) {
Thread t1 = new Thread(()->{
A.method1();
});
Thread t2 = new Thread(()->{
B.method1();
});
t1.start();
t2.start();
}
}
class A {
synchronized static void method1() {
System.out.println(Thread.currentThread().getName() + ": 锁住了" + A.class);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 我在等待" + B.class);
B.method2();
}
synchronized static void method2() {
System.out.println(Thread.currentThread().getName() + ": 获得了" + A.class);
System.out.println(Thread.currentThread().getName() + ": " + A.class + ".method2");
}
}
class B {
synchronized static void method1() {
System.out.println(Thread.currentThread().getName() + ": 锁住了" + B.class);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 我在等待" + A.class);
A.method2();
}
synchronized static void method2() {
System.out.println(Thread.currentThread().getName() + ": 获得了" + B.class);
System.out.println(Thread.currentThread().getName() + ": " + B.class + ".method2");
}
}
运行结果:

3
public class Deadlock {
public static void main(String[] args) {
final String lock1 = "lock1";
final String lock2 = "lock2";
Thread t1 = new Thread(()->{
synchronized (lock1) {
System.out.println(Thread.currentThread().getName() + ": 锁住了" + lock1);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 在等待" + lock2);
synchronized (lock2) {
System.out.println(Thread.currentThread().getName() + ": 获得了" + lock2);
}
}
});
Thread t2 = new Thread(()->{
synchronized (lock2) {
System.out.println(Thread.currentThread().getName() + ": 锁住了" + lock2);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 在等待" + lock1);
synchronized (lock1) {
System.out.println(Thread.currentThread().getName() + ": 获得了" + lock1);
}
}
});
t1.start();
t2.start();
}
}
运行结果:

构造几个死锁的例子(Java )的更多相关文章
- “全栈2019”Java多线程第二十一章:同步代码块产生死锁的例子
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第二十章:同步方法产生死锁的例子
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 1、c#中可以有静态构造方法,而java中没有,例如在单例模式中c#可以直接在静态构造中实例化对象,而java不可以
1.c#中可以有静态构造方法,而java中没有,例如在单例模式中c#可以直接在静态构造中实例化对象,而java不可以
- Java死锁的例子
死锁 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 导致死锁的根源在于不适当地运用“synchronized”关 ...
- 一个Java线程死锁的例子
package com.lk.B; public class Test4 { private static final Object o1 = new Object(); private static ...
- java死锁小例子
package cn.com.io.threadDemo.ThreadSyn; /** * 通过两个属性值创建死锁 * 本程序通过两个线程各自锁定一个属性值,这样两个线程都无法结束,造成死锁 * @a ...
- java的一个简单死锁的例子
package com.deadlock; /* * 演示死锁:(由毕向东视频所得) * 一种解释:Thread—0拿到lock1锁,Thread—1拿到lock2锁,Thread—0想要lock2锁 ...
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...
- Java死锁排查和Java CPU 100% 排查的步骤整理
================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...
随机推荐
- 安装pdo_dblib扩展连接SQLserver
1.先得安装freetdswget ftp://ftp.freetds.org/pub/freetds/stable/freetds-1.1.5.tar.gztar zxvf freetds-1.1. ...
- P2502 [HAOI2006]旅行——暴力和并查集的完美结合
P2502 [HAOI2006]旅行 一定要看清题目数据范围再决定用什么算法,我只看着是一个蓝题就想到了记录最短路径+最小生成树,但是我被绕进去了: 看到只有5000的边,我们完全可以枚举最小边和最大 ...
- SpringMVC之请求部分
1.接收请求之限定请求类型 只接受Post请求 @RequestMapping(value="",method=RequestMethod.POST) 只接受get请求 @Requ ...
- 制作OpenFOAM计算结果的gif动画【转载】
转载自:http://blog.sina.com.cn/s/blog_6277cbbf0100niqi.html PS:对其中错误地方进行了修正 1.用ParaView将每一帧都输出成图片(File- ...
- Windows 实例远程桌面报错“没有远程桌面授权服务器可以提供许可证”
参考阿里云帮助文档: https://help.aliyun.com/knowledge_detail/40859.html?spm=5176.10695662.1996646101.searchcl ...
- 2019软工实践_Alpha(2/6)
队名:955 组长博客:https://www.cnblogs.com/cclong/p/11862633.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...
- What are all the possible values for HTTP “Content-Type” header?
What are all the possible values for HTTP “Content-Type” header? You can find every content type her ...
- useEffect代替常用生命周期函数(三)
在用Class制作组件时,经常会用生命周期函数,来处理一些额外的事情(副作用:和函数业务主逻辑关联不大,特定时间或事件中执行的动作,比如Ajax请求后端数据,添加登录监听和取消登录,手动修改DOM等等 ...
- selenium操作下拉滚动条的几种方法
数据采集中,经常遇到动态加载的数据,我们经常使用selenium模拟浏览器操作,需要多次下拉刷新页面才能采集到所有的数据,就此总结了几种selenium操作下拉滚动条的几种方法 我这里演示的是Java ...
- ASP将Table导出Excel
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%><%if request("action") ...