java代码构造死锁_构造几个死锁的例子(Java )

本文通过三个具体的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()");

}

}

运行结果:

53d626e109f25e93d4e8ca33e890749c.png

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");

}

}

运行结果:

58157c1ca47f3b3c73a99cb0e48e6038.png

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();

}

}

运行结果:

19bf71b7ea7ef2182ba8d210e3fe3389.png

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值