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()方法与对象锁、锁池、等待池
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2025年10月1日 下午7:22
下一篇 2025年10月1日 下午8:01


相关推荐

  • Axis2创建WebService实例

    Axis2创建WebService实例Axis2创建WebService实例博客分类: Java综合WebServiceTomcatApacheWebXML   一、Axis2的下载和安装    1.可从http://ws.apache.org/axis2/ 下载Axis2的最新版本:     可以下载如下两个zip包:     axis2-1.5.4-bin.zip 

    2022年7月21日
    18
  • 常数变易法的原理

    常数变易法的原理高数看到常数变易法 不懂为什么要把 C 变成 u 看了篇文章 感觉懂了转载自 http www cnblogs com lookof archive 2009 01 06 1370065 html 注 本方法是对崔士襄教授写的 常数变易法 来历的探讨 论文的解释 思路并非本人原创 特此注明 背景详见本人前一篇博文 nbsp nbsp nbsp nbsp nbsp nbsp 我们来看下面的式子

    2026年3月19日
    2
  • sql中declare声明变量_sql怎么定义变量

    sql中declare声明变量_sql怎么定义变量一、变量的分类及特点1、变量的分类总体可以分为两大类:系统变量和用户自定义变量系统变量:包括全局变量和会话变量自定义变量:包括局部变量和用户用户变量2、变量的特点:1、系统变量的特点:(1)、每个客户机成功连接服务器后,都会产生与之对应的会话。会话期间,服务实例会在服务器内存中生成与该会话对应的会话系统变量。这些会话系统变量的初始值都是全局系统变量值的复制,有了标记不同的会话,会话系统又新增了一些变量,这些变量是全局扁郎没有…

    2022年8月20日
    17
  • C语言dialog函数用法,DialogBox用法

    C语言dialog函数用法,DialogBox用法该宏根据对话框模板资源创建一个模态的对话框 DialogBOX 函数直到指定的回调函数通过调用 EndDialog 函数中止模态的对话框才能返回控制 该宏使用 DialogBoxPar 函数 函数原型 intDialogBox HINSTANCEhln LPCTSTRIpTem HWNDhWndPare DLGPROCIpDia hlnstance 标识

    2026年3月19日
    2
  • 光棍节程序员闯关秀-解密

    光棍节程序员闯关秀-解密前言最近看到的了一个比较有意思的解密游戏,这解密的过程中确实花了不少的功夫,后来通过搜索才发现这是好几年前的题目,但是题目虽然是老的,但技术是没有过时的,不得不承认其中有些问题我确实解答不上来,不过解密的过程还是很有意思的,在此记录一下,游戏地址为光棍节程序员闯关秀第1关(总共10关)有兴趣的可以自己玩一下,有些题目还是很需要专业知识的,具体的解题步骤网络上一大堆,不过我发现一个问题,你们为什么不把

    2022年7月17日
    29
  • 电话光端机

    电话光端机

    2021年7月28日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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