JAVA多线程编程核心技术--synchronized--解决死锁
死锁
什么是死锁
- 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
死锁代码
Service.java
package com.service;
/**
* 死锁现象
* 本质是资源竞争引起的
* 1、A线程持有者B线程需要的锁
* 2、B线程持有者A线程需要的锁
* 3、两个synchronized嵌套非常容易引起死锁
*/
public class Service {
private final String lock = "1";
private final String lock2 = "2";
public void lock1() throws InterruptedException {
synchronized (lock) {
Thread.sleep(500);
synchronized (lock2) {
System.out.println("lock1");
}
}
}
public void lock2() throws InterruptedException {
synchronized (lock2) {
Thread.sleep(500);
synchronized (lock) {
System.out.println("lock2");
}
}
}
}
ThreadA.java
public class ThreadA extends Thread {
private Service service;
public ThreadA(Service service) {
this.service = service;
}
@Override
public void run() {
try {
service.lock1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ThreadB.java
package com.service;
public class ThreadB extends Thread {
private Service service;
public ThreadB(Service service) {
this.service = service;
}
@Override
public void run() {
try {
service.lock2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Run.java
package com.service;
public class Run {
public static void main(String[] args) {
Service service = new Service();
ThreadA a = new ThreadA(service);
a.setName("A");
a.start();
ThreadB b = new ThreadB(service);
b.setName("B");
b.start();
}
}
运行结果
image.png
总结
- 嵌套synchronized少用
