Java多线程问题:死锁和活锁的示例

原创 心已赠人 2024-10-31 12:27 118阅读 0赞

在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();
}
}
``在这个示例中,t1t2两个线程分别尝试锁定两个不同的对象lock1lock2`。由于它们尝试以不同的顺序锁定这两个对象,因此会发生死锁。

活锁示例活锁是指两个或多个线程在执行过程中,由于某些条件不满足,导致线程反复尝试但始终无法继续执行。

```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();
}
}
``在这个示例中,t1t2两个线程根据count` 数组的值来决定是否等待或增加计数。由于它们始终在检查相同的条件,并且条件始终不满足,因此它们会陷入活锁状态,反复尝试但始终无法继续执行。

这些示例展示了死锁和活锁的基本概念。在实际编程中,应尽量避免这两种情况的发生,以确保程序的稳定性和性能。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,118人围观)

还没有评论,来说两句吧...

相关阅读