在编写三个线程轮流打印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.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();
}
}
}
|