Java多线程为什么使用while循环来调用wait方法?《java并发编程实战》一书第14章列出了详细的原因(多看书还是会有收获滴),在此总结下来。示例代码:

//示例代码,从队列中获取元素
public synchronized void put(V v) throws InterruptedExcetpion{//不能使用if(isFull)while(isFull()){wait();}doPut(v)notivyALl();
}

详细原因博主梳理如下:
1、当线程A执行到wait方法会释放锁,同时线程A被阻塞。
2、当线程A被唤醒的时候,wait()仍然需要重新获取锁。
3、在线程A被唤醒到wait()重新获取锁的这段时间里,线程B可能已经获取到了锁,
并且修改了相关状态。此时线程A获取到锁之后,isFull方法又变成了true,那么在执行doPut()就会出错。确切的说是因为其他线程notifyAll的时候,所有因为wait被阻塞的线程都去尝试获取锁,只有一个线程获取到了锁并没有获取到锁,导致isFull方法可能又变成真。
4、wait方法被唤醒的时候,可能isFull不为true,因为你并不知道线程B什么时候调用了notify或者notifyAll.

基于以上原因,我们需要把wait方法while语句里面执行。事实上主要原因就是前两个即:wait需要需要释放锁和被唤起时需要重新获取锁。

Java多线程为什么使用while循环来调用wait方法相关推荐

  1. [js] js循环中调用异步的方法,如何确保执行结果的顺序是正确的?

    [js] js循环中调用异步的方法,如何确保执行结果的顺序是正确的? An example:let searchApi = function(arg){return new Promise((reso ...

  2. c++该转java吗_java多线程,静态方法加锁后,调用该方法会影响其它方法吗?

    从一个问题说起 一直想要把一些学习历程和感悟记录下来,却没有静下心来好好思考一下,今天,就从同学问到的一个问题开始,对同一个类的静态方法加锁后,调用该方法,其他方法的调用会受到影响吗? 对象锁与类锁 ...

  3. 《Java多线程编程核心技术》——1.5节sleep()方法

    本节书摘来自华章社区<Java多线程编程核心技术>一书中的第1章,第1.5节sleep()方法,作者高洪岩,更多章节内容可以访问云栖社区"华章社区"公众号查看 1.5 ...

  4. Java多线程复习:5(sleep、yield方法和线程优先级)

    sleep.yield方法和线程优先级 sleep方法 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞): 其它线程可以使用 interrupt 方法打 ...

  5. JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案

    基本概念 Java通过系统类System实现标准输入/输出的功能 通过实例化Scanner类的方式实现从键盘的数据输入 问题描述 错误示例一: import java.util.Scanner;pub ...

  6. Java同一个线程对象能否多次调用start方法

    同一个线程对象能否多次调用start方法,搞清楚这个问题,首先需要了解线程的生命周期 一.线程生命周期 更多线程状态细节描述可查看Thread内部枚举类:State 从上图线程状态转换图可以看出: 新 ...

  7. Java多线程初学者指南(5):join方法的使用

    在上面的例子中多次使用到了Thread类的join方法.我想大家可能已经猜出来join方法的功能是什么了.对,join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方 ...

  8. java线程同步的实现_【Java多线程系列三】实现线程同步的方法

    packagecom.concurrent.test;importjava.util.Stack;importjava.util.concurrent.ArrayBlockingQueue;impor ...

  9. 【笔记】【一文搞定】java - 多线程:内存模型、生命周期、方法/关键词、并发问题、线程池、案例

    参考: Java内存模型(JMM)详解 - https://zhuanlan.zhihu.com/p/518758482 线程安全性详解(原子性.可见性.有序性) - https://blog.csd ...

  10. 【Java 多线程】多线程带来的的风险-线程安全、多线程五个经典案例

    日常开发中如果用到多线程编程,也一定会涉及到线程安全问题 线程安全这个问题就不太好理解 正因为如此,程序猿们才尝试发明出更多的编程模型来处理并发编程的任务 例如:多进程.多线程.actor.csp.a ...

最新文章

  1. spring boot 服务 正确关闭方式
  2. 如何在SAP Server Side JavaScript里消费destination
  3. Serv-U服务器的管理3
  4. SQL Server CLR 启用、部署
  5. pytorch梯度下降函数_Pytorch学习笔记6:激活函数/单层感知机/梯度下降求最小值实例...
  6. lua协程的使用列子分析
  7. MongoDB 基础(六)安全性(权限操作)
  8. PHP中使用gRPC客户端
  9. 基于opencv的图片文字识别实战
  10. 自学Java软件编程需要哪些基础?
  11. clientX、pageX、screenX以及offsetX区别
  12. js 系统教程-15-js 语法之命令行-console.log,console.info,console.error,console.warn,debugger
  13. [嵌入式基础]-arm架构和x86架构区别
  14. hdu2198 How many elements you must throw out? C语言动态规划题
  15. [文摘20071019]九九重阳节的来历 重阳节传说故事 重阳节的活动习俗 重阳节诗篇
  16. R语言学习记录:proc.time、Sys.time函数
  17. 2022中国制造业行业研究报告:(现状、驱动因素、外流现象、发展趋势)27页可下载
  18. 【TCP/IP网络模型】TCP/IP网络模型的四层结构
  19. 语音识别sdk for ios android,iOS百度语音识别SDK 让你的APP不在单调
  20. itools苹果录屏大师_苹果如何录屏?查看专业录屏教程

热门文章

  1. 西北农林科技大学c语言上机题题答案,西北农林科技大学C语言上机实习4答案
  2. iphone怎么重启_手机卡死了,又不能拆电池!你会怎么处理?
  3. Java进阶:The driver is automatically registered via the SPI and manual loading of the driver class is
  4. Java集合框架源码解读(4)——WeakHashMap
  5. 论文笔记_S2D.42_2018-CRV_为经典图像处理辩护:在CPU上的快速深度补全
  6. 主干网络系列(2) -ResNet V2:深度残差网络中的恒等映射
  7. 轻量级网络模型之EfficientNet
  8. Unity学习笔记(二)——Unity ML-agents安装与配置(1.9.1)
  9. 堆排序(C++实现,非常简洁明了)
  10. 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。