在编写三个线程轮流打印1-100时,爆出了许多java.lang.IllegalMonitorStateException异常(非法的锁状态),经过摸索了解到是
condition1.await()要在Lock锁里面
同理wait要在Synchronized里
这里附上代码
class Count{ static int number = 0; private int flag=1; ReentrantLock reentrantLock = new ReentrantLock(); Condition condition1 = reentrantLock.newCondition(); Condition condition2 = reentrantLock.newCondition(); Condition condition3 = reentrantLock.newCondition(); public void add1(){ //这里由于粗心导致写成reentrantLock.newCondition(),导致 锁状态 异常 reentrantLock.lock(); try { while (flag != 1){ condition1.await(); } if (number<=100){ System.out.println(Thread.currentThread().getName()+" "+number); number++;} flag=2; condition2.signal(); }catch (InterruptedException e){ e.toString(); }finally { reentrantLock.unlock(); } } public void add2(){ reentrantLock.lock(); try { while (flag !=2){ condition2.await(); } if (number<=100){ System.out.println(Thread.currentThread().getName()+" "+number); number++;} flag=3; condition3.signal(); }catch (InterruptedException e){ e.toString(); }finally { reentrantLock.unlock(); } } public void add3(){ reentrantLock.lock(); try { while (flag !=3){ condition3.await(); }if (number<=100) System.out.println(Thread.currentThread().getName()+" "+number); number++; flag=1; condition1.signal(); }catch (InterruptedException e){ e.toString(); }finally { reentrantLock.unlock(); } } } public class Study { public static void main(String[] args) { Count count = new Count(); while (count.number <= 100) { new Thread(() -> { count.add1(); }, "A").start(); new Thread(() -> { count.add2(); }, "B").start(); new Thread(() -> { count.add3(); }, "C").start(); } } }