notify()和 notifyAll()有什么区别_notify怎么记忆

notify()和 notifyAll()有什么区别_notify怎么记忆今天看到一篇问题,提问线程唤醒顺序。具体代码如下:importjava.util.LinkedList;importjava.util.List;publicclassThreadRunSort{/***对象锁*/privatefinalObjectobject=newObject();p…

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

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

今天看到一篇问题,提问线程唤醒顺序。

具体代码如下:

 import java.util.LinkedList;
import java.util.List;

public class ThreadRunSort {

    /** 
     * 对象锁 
     */  
    private final Object object = new Object();  
    private List<Integer> sleep = new LinkedList<>();
    private List<Integer> notify = new LinkedList<>();
    /** 
     * 该线程作为一个唤醒线程 
     */  
    public void startThread(int i) {  
        Thread t = new Thread(new Runnable() {  
            @Override  
            public void run() {  
                synchronized (object) {  
                    try {
                        System.out.println(Thread.currentThread().getName()+"进入休眠");
                        sleep.add(i);
                        object.wait();
                        System.out.println(Thread.currentThread().getName()+"线程已经唤醒");
                        notify.add(i);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }  
            }  
        });  
        t.setName("Thread"+i);
        t.start();  
    }  

    public static void main(String[] args) {  
        ThreadRunSort a = new ThreadRunSort();
        for(int i =1;i<22;i++){
            a.startThread(i);
        }

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println();
        for(int i =1;i<22;i++){
            synchronized (a.object) {
                a.object.notify();
            }
        }

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("休眠顺序"+a.sleep);
        System.out.println("唤醒顺序"+a.notify);


    }    
}

发现,输入的顺序是不定的,比如:

休眠顺序[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
唤醒顺序[1, 5, 4, 3, 2, 7, 6, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 21]

 

 

但是,当修改了其中notify代码:

for(int i =1;i<22;i++){
            try {
                Thread.sleep(10);  // 在这里sleep确保notify会顺序执行
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (a.object) {
                a.object.notify();
            }
        }

 

顺序就变成

休眠顺序[1, 3, 4, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
唤醒顺序[1, 3, 4, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]

 

可以理解在wait时候,放入的是一个FIFO的队列?每次notify其实就是出队的形式。(上面顺序有问题是因为线程按顺序出队后,抢占锁的顺序和CPU有关)

 

但是,把代码改成notifyAll后:

休眠顺序[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
唤醒顺序[21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

变成了stack出栈的形式。。

具体的问题还要再研究下。。。。

 

原问题传送门:https://ask.csdn.net/questions/387308#answer_972330

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

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

(0)
上一篇 2025年10月3日 下午3:22
下一篇 2025年10月3日 下午4:01


相关推荐

  • AI辅助开发进阶:融合claude code skills教程在快马平台构建智能天气应用

    AI辅助开发进阶:融合claude code skills教程在快马平台构建智能天气应用

    2026年3月14日
    1
  • wxpython使用教程_wxPython的安装与使用教程[通俗易懂]

    wxpython使用教程_wxPython的安装与使用教程[通俗易懂]一、wxPython介绍1.wxPython是Python语言的一套优秀的GUI图形库。wxPython可以很方便的创建完整的、功能键全的GUI用户界面。wxPython是作为优秀的跨平台GUI库wxWidgets的Python1.封装和Python模块的方式提供给用户的。2.wxPython是跨平台的,可以在不修改程序的情况下在多种平台上运行。目前支持的平台有Win32/Win64、MacO…

    2022年5月21日
    41
  • 【Unity开发小技巧】打包IOS版本须知流程(移动)

    【Unity开发小技巧】打包IOS版本须知流程(移动)Unity是个开放性的平台,打包时也可以选择多种打包类型,几乎包含了所有的平台,目前主流Android,iOS平台,Android平台可以直接使用Unity自行打包,但iOS平台需要借助Mac电脑进行打包,本博客就iOS打包进行一个简单的说明,从开发到上线AppStore的所有流程。准备Mac电脑一台,苹果开发者账号一个一:unity打包Ios,Xcode工程打开Mac上的Unity,假设现在已经是开发完毕的状态,直接进行打包打开之后直接点File-BuildSettings然后将你的当..

    2022年6月27日
    116
  • springCloud五大核心组件「建议收藏」

    springCloud五大核心组件「建议收藏」1.springCloud五大组件运行流程2.springcloud简单介绍SpringCloud是微服务架构的集大成者,将一系列优秀的组件进行了整合。基于springboot构建,对我们熟悉spring的程序员来说,上手比较容易。通过一些简单的注解,我们就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。SpringCloud的组件相当繁杂,拥有诸多子项目。重点关注Netfl…

    2022年4月19日
    123
  • Onvif协议:门外汉理解ONVIF协议

    Onvif协议:门外汉理解ONVIF协议ONVIF 背景网络摄像机是网络设备 需要有通讯协议 早期的网络摄像机硬件提供商都采用私有协议 随着视频监控的网络化应用 产业链的分工将越来越细 有些厂商专门做摄像头 有些厂商专门做视频服务器 有些厂商则可能专门做平台等 然后通过集成商进行集成 提供给最终客户 私有协议无法胜任这种产业合作模式 行业标准化的接口由此应运而生 目前 网络摄像机的标准协议 国际标准上有三大类 ONVIF PSIA 和 HDCCTV 国内标准有国标 GB T28181 ONVIF 阵营日益壮大 与 PSIA HDCCTV 相比 无论是支持

    2026年3月17日
    2

发表回复

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

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