构造几个死锁的例子(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% 排查的步骤整理
================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...
随机推荐
- 服务器上build.xml文件乱码解决(亲测有效)
前提条件:必须root账户登录系统,否则无权限 1. 修改/etc/sysconfig/i18n: 拷贝如下内容到文件中 #LANG="zh_CN.UTF-8" LANG=&quo ...
- PHP ltrim() 函数
例子 <?php $str = "Hello World!"; echo $str . "<br>"; echo ltrim($str,&qu ...
- RabbitMQ入门学习系列(六) Exchange的Topic类型
快速阅读 介绍exchange的topic类型,和Direct类型相似,但是增加了"."和"#"的匹配.比Direct类型灵活 Topic消息类型 特点是:to ...
- python反射hasattr getattr setattr delattr
反射 : 是用字符串类型的名字 去操作 变量 相比于用eval('print(name)') 留有 安全隐患 反射 就没有安全问题 hasattr 语法: hasattr(object, name)o ...
- sql中的表值函数与标量值函数区别与用法
通俗来讲: 听名字就知道区别了 表值函数返回的是一张表结果,就和一个select查询语句一样,只不过里面带入了参数或者很复杂:标量值函数返回的只是一个值 一 .表值函数又分为内联函数与多语句函数 (1 ...
- 谈谈你对This对象的理解?
1.this总是指向函数的直接调用者(而非间接调用者):2.如果有new关键字,this指向new出来的那个对象:3.在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent ...
- onenote 每天输入网络密码
1.问题:只局限 内网 笔记本的弹出输入远程内网服务器用户名密码的情况,每次重启电脑后又会要求输入,否则同步失败 2.解决 控制面板-windows用户-凭据管理器-添加凭据-从上到下一次输入 ip ...
- Faster async functions and promises
https://v8.dev/blog/fast-async async function computeAnswer() { return 42;}undefinedconst p = comput ...
- Android中jsoup的混淆规则【转】
Android中jsoup的混淆规则版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 说实话这篇文章的标题和内容我觉得很水,所以读者们要是也觉得这篇文章 ...
- Tomcat清理无用应用防止漏洞
/webapps/host-manager /home/renguoqiang /webapps/manager /home/renguoqiang /webapps/host-manager rm ...