notifyone和notifyall区别_notify被动形式

notifyone和notifyall区别_notify被动形式Notify与notifyall的区别notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。 notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Notify与notifyall的区别
notifyAll
使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成
等待该对象上的锁
,一旦该对象被解锁,他们就会去竞争。
 notify
则文明得多他只是
选择一个wait状态线程进行通知,并使它获得该对象上的锁
,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。
1.两个方法都是Object对象用于通知处在等待该对象的线程的方法。
2.notify唤醒一个等待的线程;notifyAll唤醒所有等待的线程。
3.扩展在后面:
锁池:某个线程中调用了对象锁的
notify()方法
之后,争夺执行权,进入锁池。
等待池:某个线程中调用了对象锁的
wait()方法
之后,该线程主动放弃执行权并等待唤醒,进入待待池。
演示代码:(借鉴一篇博客中看到的代码)
package com.Map.test;

import java.util.concurrent.TimeUnit;

public class notifyOrNotifyAll {
public static void main(String[] args) {
Object co = new Object();
for (int i = 0; i < 5; i++) {
//用循环启动五个线程0-4
MyThread t = new MyThread(“Thread
” + i,co);
t.start();
}
try {
TimeUnit.SECONDS.sleep(2);
System.out.println(“—–Main Thread notify—–
“);
synchronized(co){

co.notify();
//唤醒一个等待的线程
}
notifyone和notifyall区别_notify被动形式
TimeUnit.SECONDS.sleep(2);
System.out.println(“Main Thread is end
.”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

static class MyThread extends Thread {
private String name;
private Object co;

public MyThread(String name, Object o) {
this.name = name;
this.co = o;
}

@Override
public void run() {
System.out.println(name + ” is waiting
.”);
try {
synchronized (co) {
co.wait();
}
System.out.println(name + “ has been notified
.”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
将其中的那个notify换成
notifyAll
运行结果
notifyone和notifyall区别_notify被动形式

扩展:
等待池
:
假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中
锁池

如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池。
sleep()和wait()方法与对象锁、锁池、等待池
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196194.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • illenium什么水平_尼采读本

    illenium什么水平_尼采读本写在最前面:目前自动化测试并不属于新鲜的事物,或者说自动化测试的各种方法论已经层出不穷,但是,能够在项目中持之以恒的实践自动化测试的团队,却依旧不是非常多。有的团队知道怎么做,做的还不够好;有的团队还正在探索和摸索怎么做,甚至还有一些多方面的技术上和非技术上的旧系统需要重构……本文将会从使用和实践两个视角,尝试对基于WebUI自动化测试做细致的分析和解读,给各位去思考和实践做一点引路…

  • 一个晚上加一个上午啊 笨死算球

    一个晚上加一个上午啊 笨死算球

  • 使用Postman做mock测试

    使用Postman做mock测试为什么要做mock测试?一般在对第三方接口(如银联、支付宝、微信等),使用mock来模拟被请求的接口还有是在业务依赖的关系接口未开发出来时,测试人员为了保证项目的测试进度不受影响,就需要构造出来一个虚拟的接口来进行一系列的接口测试一、打开postman,创建mockserver在左上角有一个New,点开后会有下拉列表展示,选择里面的MockServer勾选Request-Body(请求内容)填写mock测试的各个请求参数之后点击Next,下一步createmockserv.

  • 走进计算机病毒-基础知识「建议收藏」

    走进计算机病毒-基础知识「建议收藏」计算机病毒可通过注册表来完成其目的

  • java打印数组_Java中打印数组内容的方式有哪些?

    java打印数组_Java中打印数组内容的方式有哪些?下面是几种常见的打印方式。方法一:使用循环打印。publicclassDemo{publicstaticvoidmain(String[]args){String[]infos=newString[]{“Java”,”Android”,”C/C++”,”Kotlin”};StringBufferstrBuffer=newStringBuffer();for(…

  • Composer实战教程

    Composer实战教程

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号