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