package threadExam;
import java.util.concurrent.locks.ReentrantLock;
class Thread1 extends Thread {
private ReentrantLock lock1;
private ReentrantLock lock2;
public Thread1(ReentrantLock lock1, ReentrantLock lock2)
{
this.lock1 = lock1;
this.lock2 = lock2;
}
public void run()
{
for (int i = 1; i <=52; i++)
{
System.out.print(i);
if (i % 2 == 0) {
lock1.lock();
lock2.unlock();
}
}
}
}
class Thread2 extends Thread {
private ReentrantLock lock1;
private ReentrantLock lock2;
public Thread2(ReentrantLock lock1, ReentrantLock lock2)
{
this.lock1 = lock1;
this.lock2 = lock2;
}
public void run()
{
for (int i = 0; i < 26; i++)
{
System.out.print((char)(i + 'A'));
lock2.lock();
lock1.unlock();
}
}
}
public class Exam1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ReentrantLock lock1 = new ReentrantLock();
ReentrantLock lock2 = new ReentrantLock();
Thread t1 = new Thread1(lock1, lock2);
Thread t2 = new Thread2(lock1, lock2);
lock2.lock();
t1.run();
t2.run();
}
}
运行后报错提示:
Exception in thread "main" java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:151)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1261)
at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:457)
at threadExam.Thread1.run(Exam1.java:30)
at threadExam.Exam1.main(Exam1.java:67)