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)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这段代码全是问题啊!
启动线程应该使用start方法,直接调用run
方法不会创建新的线程
一个线程只能释放它自己的锁,不能释放别的线程的锁
一个线程调用了n次lock
,那么它最多也只能调用n次unlock