Java多线程问题:死锁和活锁的示例
在Java中,多线程编程时可能会遇到死锁和活锁这两种情况。下面我将分别给出死锁和活锁的示例代码。
死锁示例死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种僵局,导致这些线程无法继续执行。
```javapublic class DeadlockExample {
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
synchronized (lock1) {
System.out.println(“Thread1: Locked lock1”);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println(“Thread1: Locked lock2”);
}
}
});
Thread t2 = new Thread(() -> {
synchronized (lock2) {
System.out.println(“Thread2: Locked lock2”);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println(“Thread2: Locked lock1”);
}
}
});
t1.start();
t2.start();
}
}``在这个示例中,
t1和
t2两个线程分别尝试锁定两个不同的对象
lock1和
lock2`。由于它们尝试以不同的顺序锁定这两个对象,因此会发生死锁。
活锁示例活锁是指两个或多个线程在执行过程中,由于某些条件不满足,导致线程反复尝试但始终无法继续执行。
```javapublic class LivelockExample {
public static void main(String[] args) {
final int[] count = {0};
Thread t1 = new Thread(() -> {
while (true) {
synchronized (count) {
if (count[0] %2 ==0) {
System.out.println(“Thread1: Count is even, waiting…”);
try {
count.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(“Thread1: Count is odd, incrementing count”);
count[0]++;
count.notifyAll();
break;
}
}
}
});
Thread t2 = new Thread(() -> {
while (true) {
synchronized (count) {
if (count[0] %2 !=0) {
System.out.println(“Thread2: Count is odd, waiting…”);
try {
count.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(“Thread2: Count is even, incrementing count”);
count[0]++;
count.notifyAll();
break;
}
}
}
});
t1.start();
t2.start();
}
}``在这个示例中,
t1和
t2两个线程根据
count` 数组的值来决定是否等待或增加计数。由于它们始终在检查相同的条件,并且条件始终不满足,因此它们会陷入活锁状态,反复尝试但始终无法继续执行。
这些示例展示了死锁和活锁的基本概念。在实际编程中,应尽量避免这两种情况的发生,以确保程序的稳定性和性能。
还没有评论,来说两句吧...