BAEL-3837: Java Deadlock and Livelock (#8943)
This commit is contained in:
parent
2c99a832cd
commit
89da31cbce
@ -0,0 +1,60 @@
|
|||||||
|
package com.baeldung.deadlockAndLivelock;
|
||||||
|
|
||||||
|
import java.util.concurrent.locks.Lock;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
public class DeadlockExample {
|
||||||
|
|
||||||
|
private Lock lock1 = new ReentrantLock(true);
|
||||||
|
private Lock lock2 = new ReentrantLock(true);
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
DeadlockExample deadlock = new DeadlockExample();
|
||||||
|
new Thread(deadlock::operation1, "T1").start();
|
||||||
|
new Thread(deadlock::operation2, "T2").start();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void operation1() {
|
||||||
|
lock1.lock();
|
||||||
|
print("lock1 acquired, waiting to acquire lock2.");
|
||||||
|
sleep(50);
|
||||||
|
|
||||||
|
lock2.lock();
|
||||||
|
print("lock2 acquired");
|
||||||
|
|
||||||
|
print("executing first operation.");
|
||||||
|
|
||||||
|
lock2.unlock();
|
||||||
|
lock1.unlock();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void operation2() {
|
||||||
|
lock2.lock();
|
||||||
|
print("lock2 acquired, waiting to acquire lock1.");
|
||||||
|
sleep(50);
|
||||||
|
|
||||||
|
lock1.lock();
|
||||||
|
print("lock1 acquired");
|
||||||
|
|
||||||
|
print("executing second operation.");
|
||||||
|
|
||||||
|
lock1.unlock();
|
||||||
|
lock2.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(String message) {
|
||||||
|
System.out.println("Thread " + Thread.currentThread()
|
||||||
|
.getName() + ": " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sleep(long millis) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(millis);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
package com.baeldung.deadlockAndLivelock;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.locks.Lock;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
public class LivelockExample {
|
||||||
|
|
||||||
|
private Lock lock1 = new ReentrantLock(true);
|
||||||
|
private Lock lock2 = new ReentrantLock(true);
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
LivelockExample livelock = new LivelockExample();
|
||||||
|
new Thread(livelock::operation1, "T1").start();
|
||||||
|
new Thread(livelock::operation2, "T2").start();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void operation1() {
|
||||||
|
while (true) {
|
||||||
|
tryLock(lock1, 50);
|
||||||
|
print("lock1 acquired, trying to acquire lock2.");
|
||||||
|
sleep(50);
|
||||||
|
|
||||||
|
if (tryLock(lock2)) {
|
||||||
|
print("lock2 acquired.");
|
||||||
|
} else {
|
||||||
|
print("cannot acquire lock2, releasing lock1.");
|
||||||
|
lock1.unlock();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
print("executing first operation.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
lock2.unlock();
|
||||||
|
lock1.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void operation2() {
|
||||||
|
while (true) {
|
||||||
|
tryLock(lock2, 50);
|
||||||
|
print("lock2 acquired, trying to acquire lock1.");
|
||||||
|
sleep(50);
|
||||||
|
|
||||||
|
if (tryLock(lock1)) {
|
||||||
|
print("lock1 acquired.");
|
||||||
|
} else {
|
||||||
|
print("cannot acquire lock1, releasing lock2.");
|
||||||
|
lock2.unlock();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
print("executing second operation.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
lock1.unlock();
|
||||||
|
lock2.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(String message) {
|
||||||
|
System.out.println("Thread " + Thread.currentThread()
|
||||||
|
.getName() + ": " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sleep(long millis) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(millis);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void tryLock(Lock lock, long millis) {
|
||||||
|
try {
|
||||||
|
lock.tryLock(10, TimeUnit.MILLISECONDS);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean tryLock(Lock lock) {
|
||||||
|
return lock.tryLock();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user