构造几个死锁的例子(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 )的更多相关文章

  1. “全栈2019”Java多线程第二十一章:同步代码块产生死锁的例子

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. “全栈2019”Java多线程第二十章:同步方法产生死锁的例子

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. 1、c#中可以有静态构造方法,而java中没有,例如在单例模式中c#可以直接在静态构造中实例化对象,而java不可以

    1.c#中可以有静态构造方法,而java中没有,例如在单例模式中c#可以直接在静态构造中实例化对象,而java不可以

  4. Java死锁的例子

    死锁 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 导致死锁的根源在于不适当地运用“synchronized”关 ...

  5. 一个Java线程死锁的例子

    package com.lk.B; public class Test4 { private static final Object o1 = new Object(); private static ...

  6. java死锁小例子

    package cn.com.io.threadDemo.ThreadSyn; /** * 通过两个属性值创建死锁 * 本程序通过两个线程各自锁定一个属性值,这样两个线程都无法结束,造成死锁 * @a ...

  7. java的一个简单死锁的例子

    package com.deadlock; /* * 演示死锁:(由毕向东视频所得) * 一种解释:Thread—0拿到lock1锁,Thread—1拿到lock2锁,Thread—0想要lock2锁 ...

  8. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...

  9. Java死锁排查和Java CPU 100% 排查的步骤整理

    ================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...

随机推荐

  1. linux 常用性能优化

    linux 常用性能优化 1. 优化内核相关参数 配置文件/etc/sysctl.conf 配置方法直接将参数添加进文件每条一行. sysctl -a可以查看默认配置 sysctl -p 执行并检测是 ...

  2. go type别名和定义类型区别

    package main import ( "fmt" ) type person struct { age int name string } func (p person)te ...

  3. 如何把ANSYS模型输出为CDB文件并导入FLUENT  【转载】

    转载自: http://linziok99.blog.163.com/blog/static/100157302009320134826/ 在main menu中选择Archive Model ,再点 ...

  4. rg.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:

    原先跑TEST CASE的时候没有出错 但是跑到整个程序里面,除了这个问题, 网上也找了下资料,说是用merge之类的可以解决,因为你这个update的obj和session里面的不用,所以导致此问题 ...

  5. 在Android Studio中下载Android SDK的两种方式(Android Studio3.0、windows)

    方式一:网站下载:https://androidsdkmanager.azurewebsites.net/SDKPlatform 方式二.设置HTTP Proxy1. 打开Settings2. 点击H ...

  6. 蓝牙BLE: GATT Profile 简介(GATT 与 GAP)

    一. 引言 现在低功耗蓝牙(BLE)连接都是建立在 GATT (Generic Attribute Profile) 协议之上.GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很 ...

  7. TextFX Notepad++

    textFx Notepad++ - 国内版 Bing https://cn.bing.com/search?FORM=U227DF&PC=U227&q=textFx+Notepad% ...

  8. git-scm教程摘要

    Git 有三种状态 已提交(committed).已修改(modified)和已暂存(staged) 已提交表示数据已经安全的保存在本地数据库中. 已修改表示修改了文件,但还没保存到数据库中. 已暂存 ...

  9. HDCMS多图字段的使用?

    下面是HDCMS多图字段的简单使用: HDCMS在后台添加的多图,存到数据的时候是经过序列化过的,所以在使用的时候需要进行反序列化操作: $moreImg = M('keshi')->where ...

  10. PHP过狗webshell编写过程

    0x1 先上图: 0x2 编写过程 这里必须强调一下我内心的感觉,小阔爱前两天也研究了过狗的一句话了,然后我突然觉得大家都在进步,我研究点啥呢?不如也试试以前因为觉得自己不懂代码,而不会研究的免杀sh ...