A class that holds names of the threads
public class Constants {
public static final String THREADNAME_1 = "Threadname 1";
public static final String THREADNAME_2 = "Threadname 2";
}
|
The deadlocking class
import java.util.concurrent.locks.*;
public class ThreadTestDeadlockingLock {
Lock lock1 = new ReentrantLock();
Lock lock2 = new ReentrantLock();
Thread tr1 = new Thread(new runnableClass(), Constants.THREADNAME_1);
Thread tr2 = new Thread(new runnableClass(), Constants.THREADNAME_2);
public ThreadTestDeadlockingLock(){
}
public static void main(String[] argc){
ThreadTestDeadlockingLock threadtest = new ThreadTestDeadlockingLock();
threadtest.tr1.start();
threadtest.tr2.start();
}
/*
* Runnable class definition
*/
class runnableClass implements Runnable {
public runnableClass(){
}
public void getLock1Lock2(){
try{
lock1.lock();
System.out.println("Thread "+
Thread.currentThread().getName() + " Locked 1");
Thread.sleep(10);
lock2.lock();
System.out.println("Thread " +
Thread.currentThread().getName() + " Locked 2");
/*
* Do work, do not release locks
*/
Thread.sleep(1000);
}
catch(Exception ex){
System.out.println("Exception in getLock1Lock2 " +
ex.toString());
}
finally {
lock2.unlock();
lock1.unlock();
}
}
public void getLock2Lock1(){
try{
lock2.lock();
System.out.println("Thread "+
Thread.currentThread().getName() + " Locked 2");
Thread.sleep(10);
lock1.lock();
System.out.println("Thread "+
Thread.currentThread().getName() + " Locked 1");
/*
* Do work, do not release locks
*/
Thread.sleep(1000);
}
catch (Exception ex){
System.out.println("Exception in getLock2Lock1()" + ex.toString());
}
finally {
lock1.unlock();
lock2.unlock();
}
}
public void run(){
for(int i=0; i<100; i++){
if(Constants.THREADNAME_1.equals(Thread.currentThread().getName())){
getLock1Lock2();
}
else {
getLock2Lock1();
}
}
}
} // End of internal class
}
|