wait--notify--虚假唤醒的理解!

总:我发现其实网上好多人在解释 线程间通信--问题:虚假唤醒的时候都是说错了的,下面谈谈自己的理解!!!!!
案例:一个资源类 中 +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()等待下一次被唤醒
  即不会出现多+数字的情况了。

**

在这里插入图片描述

发布了29 篇原创文章 · 获赞 0 · 访问量 413

猜你喜欢

转载自blog.csdn.net/qq_39965727/article/details/103586920