普通线程
java.lang.IllegalMonitorStateException 异常是由于线程在未获对象锁时,对对象使用了wait(),notify(),notifyAll()等方法
synchronized (this) {
System.out.println(Thread.currentThread().getName() + ":" + count.getAndAdd(1));
this.notifyAll();
this.wait();
}
要先获取到this的锁,才能使用this的notify等方法
Lock
在使用Lock锁的Condition时没有获取到Lock锁就使用了await(),signal();signalAll()等方法
总结:即在未获取到锁的情况下,使用了同步方法
while (integer.get() < 100) {
//判断是否为奇数
if (NumUtil.isJ(integer.get())) {
//获得锁
lock.lock();
//二次判断 参考单例模式
if (NumUtil.isJ(integer.get())) {
//范围二次校验
if (integer.get() >= 100) {
return;
}
System.out.println(Thread.currentThread().getName() + "奇数线程:" + integer.get());
//i++
integer.addAndGet(1);
//通知其他等待线程
condition.signal();
try {
//活干玩了 休息一下
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//把锁还了
lock.unlock();
}
}