构造几个死锁的例子(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% 排查的步骤整理
================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...
随机推荐
- git添加公钥后报错sign_and_send_pubkey: signing failed: agent refused operation的解决办法
在服务器添加完公钥后报错 sign_and_send_pubkey: signing failed: agent refused operation 这个时候我们只要执行下 eval "$( ...
- Hadoop hadoop balancer配置
hadoop版本:2.9.2 1.带宽的设置参数: dfs.datanode.balance.bandwidthPerSec 默认值 10m 2.datanode之间数据块的传输线程大小:dfs. ...
- 2、ES6结构赋值和模板字符串
ES6允许按照一定的模式,从数组和对象中提取值,这被称为结构,即解开数据的结构 1.数组的解构赋值 let [a,b] = [1,2] let [a,b,c=100] = [1,2] //c的默认值为 ...
- (一)Sql学习之sql语言的组成
SQL语言是具有强大查询功能的数据库结构化语言.由以下几部分组成: 1.数据定义类SQL(DDL--DATE DEFINITION LANGUAGE) CREATE-创建数据库及其对象(表,索引,视图 ...
- [spring-boot] 健康状况监控
pom文件 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s ...
- [spring-boot] 多环境配置
application-{profile}.properties 按照格式创建两个配置文件,一个DEV环境,一个测试环境 修改其端口: server.port=8888 DEV server.port ...
- 在java的Map集合中,怎样更改value的值
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/chenyao1994/article/de ...
- 随机森林算法OOB_SCORE最佳特征选择
RandomForest算法(有监督学习),可以根据输入数据,选择最佳特征组合,减少特征冗余:原理:由于随机决策树生成过程采用的Boostrap,所以在一棵树的生成过程并不会使用所有的样本,未使用的样 ...
- Type-C转接头 还是别用了,影响速率啊
今天用Type-C转接USB头传照片真慢! 在数码配件领域,越是不起眼的小外设,隐藏其背后的猫腻和水分也就越多.就拿常见的Micro USB转USB Type-C转接头和TF转SD卡套而言,你觉得 ...
- 当fixed元素相互嵌套时,父元素会影响子元素的层叠关系,最好不要嵌套使用fixed
问题:fixed元素被另一个fixed元素包含的时候在chrome下fixed子元素的定位会受到父元素的影响. 解释:层叠关系是受层叠上下文影响的.文档中的层叠上下文由满足以下任意一个条件的元素形成: ...