多线程中的死锁
在使用多线程时,有这么一种情况:
- 有两个线程:线程A、线程B
- 有两个对象锁:LockA、LockB
当线程A想要去执行共享数据时,需要先获取到LockA对象锁,再获取到LockB对象锁后,才可以去操作共享数据。
当线程B想要去执行共享数据时,需要先获取到LockB对象锁,再获取到LockA对象锁后,才可以去操作共享数据。
场景: 线程A获取到LockA对象锁后,CPU把线程A切换,切换到线程B上执行,线程B执行时获取到LockB对象锁,此时CPU又切换线程A上执行。
问:此时会发生什么情况?
会发生死锁现象(程序中的体现,JVM在运行,但是程序停止不动)
public class DeadLock {
//1. 创建两把锁.
public static final String LOCKA = "锁A";
public static final String LOCKB = "锁B";
public static void main(String[] args) {
//2. 一个线程先抢锁A, 再抢锁B.
new Thread() {
@Override
public void run() {
//4. 为了让效果更明显, 用循环改进.
while (true) {
//先抢锁A, 再抢锁B.
synchronized (LOCKA) {
System.out.println(getName() + " 获取到 " + LOCKA + ", 等待 " + LOCKB);
synchronized (LOCKB) {
System.out.println(getName() + " 获取到 " + LOCKB + ", 成功的进入 小树林!");
}
}
}
}
}.start();
//3. 另一个线程先抢锁B, 再抢锁A
new Thread() {
@Override
public void run() {
//4. 为了让效果更明显, 用循环改进.
while (true) {
//先抢锁A, 再抢锁B.
synchronized (LOCKB) {
System.out.println(getName() + " 获取到 " + LOCKB + ", 等待 " + LOCKA);
synchronized (LOCKA) {
System.out.println(getName() + " 获取到 " + LOCKA + ", 成功的进入 小树林!");
}
}
}
}
}.start();
}
}