总:我发现其实网上好多人在解释 线程间通信--问题:虚假唤醒的时候都是说错了的,下面谈谈自己的理解!!!!!
案例:一个资源类 中 +1和 -1 的2个同步方法,操作其属性 number;
首先应该明确:线程中使用wait()后,当前线程方法其实是相当于释放了当前对象的锁的
(这也是多线程环境下,其他线程才能并发调用 到 同一 对象的 其他同步方法 如:-1数字的同步方法)**
不要小看这点概念
! (ps:自己当时理解时,因为掉进了被synchronized所修饰的普通方法的对象还没执行完时,我就当时认定了其他线程应该不能访问到此同对象的其他 普通同步方法了如 -1,+1两个方法,造成了后面对凭啥可能出现数据异常的苦苦怀疑!!,真的是日了狗,还专门去看wait的官方解释的才 明白咋回事。)
**
自己对--虚假唤醒的见解:
1.假如此时 number = 1,线程a进入此方法,wait后释放锁后,
2.此时万一还是被加操作的线程C 得到锁的也进行的曾操作,
3.那么那边 当C 也进入此法内后也wait释放锁后,所有线程竞争,
4.万一恰好线程A又拿到cpu资源话(被唤醒)
5.那么,如果此方法如果是前面是 if 判断的话,那么就是直接 的 线程A和C会 走到下面+1 操作,就可能多加数字了
6.如果是 while,那么就算 4. 中线程A又是拿到资源被唤醒,但他会继续执行while的判断数字number是否是已经被加过了,
如果还没被加过(即此时线程 C 也还没有执行到 +1 的操作,准确说 C 也还在 while 循环判断条件 内)--》此时就会继续执行wait()等待下一次被唤醒
即不会出现多+数字的情况了。
**