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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 重庆职称计算机考试网,重庆职称计算机考试大纲

    重庆职称计算机考试网,重庆职称计算机考试大纲(2005年7月修订)根据重庆市职称改革办公室《关于调整全市专业技术人员职称外语和职称计算机考试有关规定的通知》(渝职改办〔2005〕99号),我市职称计算机考试分为6个级别,分别用字母A、B、C、D、E、F表示。我市职称计算机考试教材全书共有九个部分。其中计算机基础知识、中文Windows2000操作基础、中文Word2000、计算机网络基础与Internet应用、中文Access2000…

    2022年5月25日
    36
  • 转 提问的智慧

    转 提问的智慧维基入口: 提问的智慧英文版http://www.catb.org/~esr/faqs/smart-questions.html中文版http://www.beiww.com/doc/oss/smart-questions.html

    2022年7月26日
    3
  • docker离线安装部署_ubuntu 离线安装docker

    docker离线安装部署_ubuntu 离线安装docker说明使用虚拟机真实模仿离线环境虚拟机系统为CentOS7正文下载Docker二进制文件(离线安装包):下载地址本文使用/x86_64/docker-17.12.1-ce.tgz,注意对应操作系统类型。通过FTP工具将docker-17.12.1-ce.tgz上传到服务器上解压安装包tarzxfdocker-17.12.1-ce.tgz将docker相关命令拷贝到/usr/bin,方便直接运行命令sudocpdocker/*/usr/bin/启动Docke

    2022年9月26日
    0
  • 优先队列的数据结构_低优先级队列一天只能一场

    优先队列的数据结构_低优先级队列一天只能一场目录一.PriorityQueuePriorityQueue简介继承关系PriorityQueue示例二.Comparable比较器Compara接口三.Comparator比较器Comparator接口四.底层原理一.PriorityQueuePriorityQueue简介PriorityQueue,即优先级队列。优先级队列可以保证每次取出来的元素都是队列中的最小或最大的元素<Java优先级队列默认每次取出来的为最小元素&gt.

    2022年9月23日
    0
  • php三个数从大到小排列_php常用的流程控制语句

    php三个数从大到小排列_php常用的流程控制语句<?php$a = rand(100,999);$b = rand(100,999);$c = rand(100,999);echo “a=”.”$a”.”<br>”;echo “b=”.”$b”.”<br>”;echo “c=”.”$c”.”<br>”;if(($a > $b ) && ($a > …

    2022年8月18日
    3

发表回复

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

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