博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA中wait和notify,sleep
阅读量:5933 次
发布时间:2019-06-19

本文共 976 字,大约阅读时间需要 3 分钟。

hot3.png

在java多线程中需要用到wait和notify。

这两个操作都必须在同步块内部。

调用wait之后就会在wait位置上卡住,把当前同步的锁释放,从新等待当前对象的锁。

当notify的时候,首先将同步块运行结束,然后释放锁并通知其他wait线程开始进行锁竞争。其他wait线程只有一个可以获得锁。

那notify和notifyAll有什么区别呢?notify是唤醒多个wait线程中的一个并让他继续工作,notifyAll是唤醒所有的wait线程让他们重新进行锁的竞争。使用notify和notifyall的时候需要注意,notify与wait必须是一对一的,需要写程序的时候控制好,避免有wait无notify的情况。使用notifyall的时候是让所有的wait线程有机会(其中一个获取锁,其他的也都获取锁的时候也会继续)向下执行,就需要考虑wait方法后续的资源是否可以使用的情况。

sleep是Thread的静态方法,他不是多线程用的,好多人把他与多线程联系是不正确的。

sleep是使得当前线程卡主等待,跟锁或者同步有关系。

从应用上讲,wait和sleep都是使得线程卡主,都可以通过interrupt打断。

 

JAVA多线程造成死锁的可能有:

  1. 对于一把锁,wait之后忘记notify

  2. 对于多把锁,当线程1拿到了A锁,线程2拿到了B锁,这是线程1等待B锁,线程2等待A锁

 

package spyudemo.thread;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import javax.management.Query;public class TestQueue { public LinkedList queueList=new LinkedList();  private SendThread[] sendThreadArr=null;  public TestQueue(int threadNum){  sendThreadArr=new SendThread[threadNum];  for(int i=0;i

转载于:https://my.oschina.net/u/1458864/blog/284570

你可能感兴趣的文章
.NET Core如何为项目提供高性能解决方案?
查看>>
你以为AlphaGo只是下围棋厉害?不,它还能用来优化金融交易策略参数
查看>>
HashMap源码分析
查看>>
compass watch 报CompatibilityError 解决方案
查看>>
Payara基金会发布全面支持MicroProfile 2.0的5.183版Payara Server和Payara Micro
查看>>
函数式编程语言时代已经来临
查看>>
Yarn将用TypeScript重写,Flow惨遭亲爹抛弃!
查看>>
Visual Studio 2017 15.7预览版发布
查看>>
Python数据科学平台Anaconda的最新发布中增加了Microsoft VS Code
查看>>
利用媒体云实现差异化
查看>>
Imperva开源域目录控制器,简化活动目录集成
查看>>
保Cloudera弃Hortonworks,新平台将支持五大云供应商
查看>>
斩获BAT等7家Offer!GitHub 4万Star项目作者的面试经历
查看>>
编写Linux内核模块——第二部分:字符设备
查看>>
LinkedIn开源Dr. Elephant
查看>>
ASP.NET Core 3.0项目开始“瘦身”
查看>>
敏捷领导力的反面模式
查看>>
Microsoft发布Azure Data Factory v2可视化工具的公开预览版
查看>>
Concourse:可扩展的开源CI管道工具
查看>>
自定义事件
查看>>