java notify和wait

【java并发】 --wait与notify原理 重量级锁通过对象内部的监视器(monitor)实现,其中monitor的本质是依赖于底层操作系统的Mutex Lock实 现,操作系统实现线程之间的切换需要从用户态到内核态的切换,切换成本非常高。前面我们在讲Java对象头的时候,讲到了monitor这个对象,在hotspot虚拟机中,通过ObjectMonitor类来实现monitor。他的锁的获取过程的体现会简单很多. wait 和notif... 阅读详情
package com.data;
public class Test {
    public static class AstronLock{
    }

    public static class Produce implements Runnable{
        private AstronLock astronLock;
        Produce(AstronLock astronLock){
            this.astronLock = astronLock;
        }
        @Override
        public  void run()  {
            System.out.println("生产者开始生产");
            synchronized(astronLock) {
                try {
                    Thread.sleep(1000);
                    astronLock.notifyAll();
                System.out.println("生产者生产,完成");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static class Consumer implements Runnable{
        private AstronLock astronLock;
        Consumer(AstronLock astronLock){
            this.astronLock =  astronLock;
        }

        @Override
        public  void run() {
            System.out.println(Thread.currentThread().getName()+"消费者申请消费");
            synchronized(astronLock) {
                try {
                    astronLock.wait();

                System.out.println(Thread.currentThread().getName()+"消费者完成");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws Exception{
        AstronLock astronLock = new  AstronLock();
      /*  Produce pro = new Produce(astronLock);
        Consumer consumer = new Consumer(astronLock);*/
        new Thread(new Consumer(astronLock)).start();
        new Thread(new Consumer(astronLock)).start();
        new Thread(new Consumer(astronLock)).start();
        Thread.sleep(1000);
        new Thread(new Produce(astronLock)).start();
    }
}

Thread-0消费者申请消费
Thread-2消费者申请消费
Thread-1消费者申请消费
生产者开始生产
生产者生产,完成
Thread-1消费者完成
Thread-2消费者完成
Thread-0消费者完成

改下notifyAll只有notify1个完成

package com.data;

public class Test {
    public static class AstronLock{
    }

    public static class Produce implements Runnable{
        private AstronLock astronLock;
        Produce(AstronLock astronLock){
            this.astronLock = astronLock;
        }
        @Override
        public  void run()  {
            System.out.println("生产者开始生产");
            synchronized(astronLock) {
                try {
                    Thread.sleep(1000);
                    astronLock.notify();
                System.out.println("生产者生产,完成");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static class Consumer implements Runnable{
        private AstronLock astronLock;
        Consumer(AstronLock astronLock){
            this.astronLock =  astronLock;
        }

        @Override
        public  void run() {
            System.out.println(Thread.currentThread().getName()+"消费者申请消费");
            synchronized(astronLock) {
                try {
                    astronLock.wait();

                System.out.println(Thread.currentThread().getName()+"消费者完成");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws Exception{
        AstronLock astronLock = new  AstronLock();
      /*  Produce pro = new Produce(astronLock);
        Consumer consumer = new Consumer(astronLock);*/
        new Thread(new Consumer(astronLock)).start();
        new Thread(new Consumer(astronLock)).start();
        new Thread(new Consumer(astronLock)).start();
        Thread.sleep(1000);
        new Thread(new Produce(astronLock)).start();
    }
}

Thread-0消费者申请消费
Thread-1消费者申请消费
Thread-2消费者申请消费
生产者开始生产
生产者生产,完成
Thread-0消费者完成

  public static class Consumer implements Runnable{
        private AstronLock astronLock;
        Consumer(AstronLock astronLock){
            this.astronLock =  astronLock;
        }

        @Override
        public  void run() {
            System.out.println(Thread.currentThread().getName()+"消费者申请消费");
            synchronized(astronLock) {
                try {
                    astronLock.wait();
                    Thread.sleep(10000);

                System.out.println(Thread.currentThread().getName()+"消费者完成在"+System.currentTimeMillis());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
Thread-0消费者申请消费
Thread-2消费者申请消费
Thread-1消费者申请消费
生产者开始生产
生产者生产,完成在1516265168543
Thread-1消费者完成在1516265178544
Thread-2消费者完成在1516265188545
Thread-0消费者完成在1516265198546

这里面可以看出Thread.sleep(10000);并不会释放对象锁。所以每个线程都是带着锁sleep了10秒才释放锁。

引入概念。对象的锁池和等待池。

main中有个sleep。是因为如果通知过早,会打乱程序的执行逻辑。应该先wait再用notify或者notifyAll,要不达不到预想效果

告别水印!Vue3项目集成Stimulsoft.Reports.js完整配置与激活指南 本文详细介绍了如何在Vue3项目中集成Stimulsoft.Reports.js,提供从授权策略到性能优化的完整解决方案。通过模块化架构设计和现代化引入方式,帮助开发者高效实现专业级报表功能,同时避免版权风险和水印问题,特别适合中小型项目需求。 阅读详情

相关推荐

对比实验系列:Efficientdet环境配置及训练个人数据集

可以通过下方链接下载Efficientdet源码。

Yayisheng的博客 4586

常见的wait等待事件及处理(zt)

常见的wait等待事件及处理 1、db file sequential read 调整SQL,增加buffer cache,加快磁盘读写速度 2、log file sync 减少事务提交,将redo文件存放于高速硬盘...

cox11952的博客 545

Web自动化神操作:如何用OpenCV 破解滑块验证码?

验证码作为一种安全机制,可以有效防止暴力破解密码、发帖、灌水、刷票等,大家在做 Web 自动化的时候应该有碰到验证码这个难题,一般我们可以和开发沟通请求他们的帮助:去掉验证码或者设置一个万能验证码,而如果开发不帮忙我们该如何去解决呢? 本篇文章以 Java 语言为例教你怎么破解验证码。 现在大多数网址会采用滑块验证码的方式,下面以腾讯的滑块验证码为例,先来看看破解的效果: 要破解滑块验证码,我们一般采取的思路如下: 获取滑块到背景缺口图的距离 通过 selenium 的 Actio

不喝枸杞的程序员 2036

java——wait和notify的基本用法

wait的用法以及它的3种结束条件:1.notify2.interrupted3.时间超时

xhhhx_的博客 1万+

金融级IT架构-数字银行的云原生架构解析

最近断断续续花了差不多2到3周的时间阅读完由电子工业出版社出版的《金融级IT架构:数字银行的云原生架构解密》的这本书,作者是作者是网商银行技术编委会。 本书契合了当前银行业分布式架构转型趋势,内容是经过实践检验的领先技术介绍了网商银行IT技术架构演进路线,涵盖了分布式、单元化、弹性混合云、云原生多个基础架构领域,同时介绍了技术风险、安全可信、业务架构等多方面的技术实践经验。 对于这本书实际很早搜索云原生相关书籍的时候就搜索到,但是一看标题是金融IT架构方面的因此没有引起太多的重视,后面由华章...

年少有为 4064

实战解析:基于Python的APT攻击检测与ATT&CK框架应用

本文通过实战案例,详细解析了如何利用Python编程语言结合MITRE ATT&CK框架,构建一套针对高级持续性威胁(APT)的自动化检测与狩猎系统。文章涵盖了从环境搭建、核心检测逻辑编写、到模块化框架设计与主动威胁狩猎的全过程,为安全从业者提供了可落地的技术方案,以有效应对复杂的网络攻击。

weixin_29044157的博客 389

Java中的wait和notify

前言完成这个协调工作, 主要涉及到四个方法wait() / wait(long timeout): 让当前线程进入等待状态.notify() / notifyAll(): 唤醒在当前对象上等待的线程。

qq_65501447的博客 1320

JSBSim开发手册:飞机仿真模型开发指南

JSBSim是一款开源的飞行动力学模型仿真引擎,支持多种飞行器的仿真,包括固定翼飞机、直升机、无人机等。JSBSim的设计目标是提供一个灵活、高效、精确的飞行动力学仿真环境。飞行动力学仿真:实现飞行器的动力学仿真,包括空气动力学、发动机、质量和惯性等模型。控制系统仿真:实现飞行器的控制系统仿真,包括自动驾驶仪、飞控系统等。环境仿真:模拟飞行环境,包括大气模型、风力模型等。本文详细介绍了如何使用C++进行JSBSim开发,包括系统设计、模型实现、代码优化和性能调优等方面的内容。

qq_38334677的博客 4526

Java等待唤醒机制wait/notify深入解析

本文将帮助你彻底弄明白Java的wait/notify等待唤醒机制。为了弄明白wait/notify机制,我们需要清楚线程通信、volatile和synchronized关键字、wait/notify方法、Object的monitor机制。本文将会从这几个方面详细讲解Java的wait/notify等待唤醒机制。 一、线程通信 如果一个线程从头到尾执行完也不和别的线程打交道的话,那就不会有各种安全性问题了。但是协作越来越成为社会发展的大势,一个大任务拆成若干个小任务之后...

1万+

人形机器人电路板和算法分析

人形机器人电路板与算法深度剖析 电路板领域:人形机器人电子系统分为计算、驱动、感知、能源、通信五大模块。主控板采用高性能SoM(如NVIDIA Jetson AGX Orin),需满足严格电源完整性(PDN)与信号完整性(SI)要求;关节驱动板集成MCU、GaN/SiC功率器件及高精度编码器接口,采用刚柔结合PCB以适应狭小空间。挑战包括热-振可靠性(85°C/10G振动)、高密度互连(3mil线宽)及EMC兼容性。 算法领域:运动控制依赖MPC(模型预测控制)与强化学习(RL),实现实时动态平衡;感知算法

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 306

手把手教你学simulink(13.2)--构建一个单相并网逆变器Simulink仿真模型

基于Simulink的单相并网逆变器项目的详细仿真实例。这个项目将重点放在逆变器的详细建模、最大功率点跟踪(MPPT)控制策略、并网控制和仿真分析上。我们将使用MATLAB/Simulink来构建整个系统,并通过具体的代码和模块来实现各个功能。

MHD0815的博客 545

java,wait与notify

<br />  今天同学写个手机游戏,用蓝牙传输数据的时候丢包,问我解决方案,我提出的方案是:用多线程发送数据并要求对方回送ack号,如果在一定时间内没收到就要重发,如果收到了就要自身wait,那么这要用到多线了,开始写了几个老是报错,就在网上找了找这方面的资料,终于解决了,呵呵!下面我把这篇写的比较全面的文章转载过来,做个笔记,希望能帮助更多的用多线程出现问题的朋友们。<br />  <br />wait与notify是java同步机制中重要的组成部分。结合与synchronized关键字使用,可以建立很

4905

如何在MacBook上安装部署原生openclaw

本文介绍了在MacBook上安装OpenClaw的详细步骤:首先通过curl或国内镜像源安装nvm和Node.js(版本≥22),然后使用nvm安装Node.js 24并验证安装。接着通过脚本快速安装OpenClaw,完成安装后选择Qwen作为AI模型并进行OAuth认证。配置过程中可跳过联网搜索和Agent技能设置,最后选择Web界面作为呈现方式。安装完成后,系统会启动openclaw-gateway进程并打开Web界面,用户可通过简单的"hello"指令开始与AI对话。目前基础功能已

木简熙的博客 810

JAVA-wait()和notify()

大家应该都知道,线程之间是抢占式随机执行的,但是我们并不希望这样。因为这样非常混乱,并不好去预估程序的执行结果。我们甚至希望,线程之间能够配合执行,那么我们就可以使用wait()和notify()来做到。

Lizhihao_的博客 1552

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

详解 Java 中的 Wait 和 Notify 机制

写在前面 Wait 和 Notify 是 Java 面试中常见的问题,但是在平时工作中可能不常见到。大家或多或少知道些背景知识,例如二者均为 Object 类的方法,而不是 Thread 特有的(因为锁是每个对象都具有的特性,因此操作锁的方法也紧跟对象,没毛病),且都只能在同步代码块中调用(即前提是先获得对象的监视器锁,一般来说在 synchronized 代码块中使用),否则抛出异常 Illeg...

旧时光 | YoungChen's 博客 2842

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java【多线程】wait和notify

由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知.但是实际开发中有时候我们希望合理的协调多个线程之间的执⾏先后顺序.

zrwcnm的博客 982

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java线程没wait前调用notify,深入Java线程 之 wait和notify

wait和notify多线程是需要同步协作,比如QuartzSchedulerThread,作为Quartz的任务调度线程,如果设置该线程暂停,那么这个线程就必须wait, 等外界通知继续的时候,再执行任务。// check if we're supposed to pause...synchronized (sigLock) {while (paused && !halted.g...

weixin_31022203的博客 1165

Java wait和notify方法解释

wait与notify的API以及解释 public final void wait() throws InterruptedException { wait(0); } public final void wait(long timeout, int nanos) throws InterruptedException {} public final native void wait(long timeout) throws InterruptedException; public fina

wenhonglian的博客 631

Java EE初阶——wait 和 notify

线程饥饿是指的现象。

2302_80250536的博客 907

java wait与notify方法

一、wait与notify 1.wait()方法 语义:使得当前线程立刻停止运行,处于等待状态(WAIT),并将当前线程置入锁对象的等待队列中,直到被通知(notify)或被中断为止。 使用条件:wait方法只能在同步方法或同步代码块中使用,而且必须是内建锁。wait方法调用后立刻释放对象锁 wait方法的重载 1)public final void wait() throws Inte...

eve8888888的博客 2万+

【Java】【基础】wait和notify方法

waithe notify方法不是线程对象的方法,是java中任何一个java对象都有的方法,这两个方法是Object类中自带的 wait()方法和notify()方法的作用 wait()方法 Object o = new Object(); o.wait(); //表示让正在o对象上活动的线程(当前线程)进入等待状态,无期限等待,直到被唤醒为止 notify()方法 //将在o对象上等待的线程唤醒 o.notify();//唤醒o对象上正在等待的线程 wait()方法会让正在该对象上戳东

liuxiaowei 792

Java Object的wait和notify方法

Java Object的wait和notify方法需要知道的一些事情

26857259 866

Java 线程的 wait 和 notify 的神坑

也许我们只知道wait和notify是实现线程通信的,同时要使用synchronized包住,其实在开发中知道这个是远远不够的。接下来看看两个常见的问题。 问题一:通知丢失 创建2个线程,一个线程负责计算,一个线程负责获取计算结果。 public class Calculator extends Thread { int total; @Override ...

ywl470812087的博客 11万+

Java中多线程wait和notify的用法

本篇文章主要介绍wait和notify的使用,大家可能感到疑惑的问题:比如wait和notify为什么需要加锁?wait和sleep的区别等。

qq_63218110的博客 2776

Java并发编程-wait和notify原理剖析

1.小故事 - 为什么需要 wait 有一对小孩都要使用算盘CPU进行计算,为了计算过程中的计算安全,老王设计了一个synchronized锁,让每个时刻只有一个线程进入房间成为owner的主人。这样只能排队一个一个线程的来,从而保证计算过程中的线程安全。 由于条件不满足,小南不能继续进行计算(比如他必须要叼根烟,有烟才能进行计算) 但小南如果一直占用着锁,其它人就得一直阻塞,效率太低 于是老王单开了一间休息室(调用 wait 方法),让小南到休息室(WaitSet)等着去了,但这时锁释放开,其它人可以由

Java硬件工程师的博客 2392

Java多线程之wait和notify的使用

在前面我们已经介绍过了join()方法可以用来控制线程的执行顺序了,但是join()却只能让整个线程执行结束再去执行另外的线程。控制线程执行顺序的效果是有限的,因此又有了wait()和notify(),目的其实都是为了控制程序的执行顺序的。本篇博客就主要来介绍wait()和notify()的使用。wait()方法其实主要做三件事:①把当前线程放进等待队列中②释放锁③被其他线程唤醒时,尝试重新获取锁接下来看一段问题代码:System.out.println("wait()之前");

m0_64986499的博客 968
上一篇: flink系列5 最简单的hello world
下一篇: JAVA多线程之线程间的通信方式
dataastron
博客等级 码龄10年 26粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值