• wait(),notify(),notifyAll()必须加锁的原因


    从语义方面解析为什么需要锁:

      1、wait()方法会释放锁,如果没有先获得锁,那么如何释放? 

    从实际的作用:

      为了预防饥饿线程的产生。

     原因:

    // 线程A 的代码
    while(!condition){ // 不能使用 if , 因为存在一些特殊情况, 使得线程没有收到 notify 时也能退出等待状态
        wait();
    }
    // do something
    

      

    // 线程 B 的代码
    if(!condition){ 
    	// do something ...
        condition = true;
        notify();
    }
    

    现在考虑, 如果wait() 和 notify() 的操作没有相应的同步机制, 则会发生如下情况

    【线程A】 进入了 while 循环后(通过了 !condition 判断条件, 但尚未执行 wait 方法), CPU 时间片耗尽, CPU 开始执行线程B的代码
    【线程B】 执行完毕了 condition = true; notify(); 的操作, 此时【线程A】的 wait() 操作尚未被执行, notify() 操作没有产生任何效果
    【线程A】执行wait() 操作, 进入等待状态,如果没有额外的 notify() 操作, 该线程将持续在 condition = true 的情形下, 持续处于等待状态得不到执行。


    原文链接:https://blog.csdn.net/lengxiao1993/article/details/52296220

  • 相关阅读:
    信息安全[0836]
    05 二极管的微变等效和稳压二极管
    04 二极管的直流等效通路
    STM32 ADS112C04
    03 PN与二极管的特性
    STM32中的程序在RAM还是FLASH里运行?
    基于STM32的MLX90614人体红外测温枪
    KEIL5如何打开KEIL4工程 [复制链接]
    02 PN结的形成
    PreparedStatement和Statament的性能
  • 原文地址:https://www.cnblogs.com/chen--biao/p/11358016.html
Copyright © 2020-2023  润新知