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)
2 回答

瀟瀟雨雨
TA貢獻1833條經(jīng)驗 獲得超4個贊
這段代碼全是問題?。?/p>
啟動線程應該使用
start
方法,直接調(diào)用run
方法不會創(chuàng)建新的線程一個線程只能釋放它自己的鎖,不能釋放別的線程的鎖
一個線程調(diào)用了n次
lock
,那么它最多也只能調(diào)用n次unlock

侃侃爾雅
TA貢獻1801條經(jīng)驗 獲得超16個贊
程序在運行時可能出現(xiàn)如下情況
主線程 lock2.lock
thread1 run 此時 i=1 跳過
thread2 運行 lock2.lock lock1.unlock
還沒有l(wèi)ock的情況下就unlock
添加回答
舉報
0/150
提交
取消