java中wait和notify

    在JAVA中,是没有类似于PV操作、进程互斥等相关的方法的。JAVA的进程同步是通过synchronized()来实现的,需要说明的是,JAVA的synchronized()方法类似于操作系统概念中的互斥内存块,在JAVA中的Object类型中,都是带有一个内存锁的,在有线程获取该内存锁后,其它线程无法访问该内存,从而实现JAVA中简单的同步、互斥操作。明白这个原理,就能理解为什么synchronized(this)与synchronized(static XXX)的区别了,synchronized就是针对内存区块申请内存锁,this关键字代表类的一个对象,所以其内存锁是针对相同对象的互斥操作,而static成员属于类专有,其内存空间为该类所有成员共有,这就导致synchronized()对static成员加锁,相当于对类加锁,也就是在该类的所有成员间实现互斥,在同一时间只有一个线程可访问该类的实例。如果只是简单的想要实现在JAVA中的线程互斥,明白这些基本就已经够了。但如果需要在线程间相互唤醒的话就需要借助Object.wait(), Object.nofity()了。

    Obj.wait(),与Obj.notify()必须要与synchronized(Obj)一起使用,也就是wait,与notify是针对已经获取了Obj锁进行操作,从语法角度来说就是Obj.wait(),Obj.notify必须在synchronized(Obj){...}语句块内。从功能上来说wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行。相应的notify()就是对对象锁的唤醒操作。但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供了在线程间同步、唤醒的操作。Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制。

 

    单单在概念上理解清楚了还不够,需要在实际的例子中进行测试才能更好的理解。对Object.wait(),Object.notify()的应用最经典的例子就是生产者-消费者模式,实现一个如下:

public class Test {
	static Apple apple = new Apple();
	public static void main(String[] args) {
//		for (int i=0; i<10; i++) {
			new ProducerThread(apple).start();
			new CustomerThread(apple).start();
//		}
	}
}

class ProducerThread extends Thread {
	Apple apple;
	public ProducerThread(Apple apple) {
		this.apple = apple;
	}
	
	@Override
	public void run() {
		try {
			for (int i=0;i<10;i++) {
				apple.addApple();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class CustomerThread extends Thread {
	Apple apple;
	public CustomerThread(Apple apple) {
		this.apple = apple;
	}
	
	@Override
	public void run() {
		try {
			for (int i=0;i<10;i++) {
				apple.removeApple();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class Apple {
	int count = 0;
	synchronized void addApple() throws InterruptedException {
		if (count > 0) {
			System.out.println("producer begin wait");
			wait();
			System.out.println("producer after wait");
		} else {
			System.out.println("producer add apple");
			count ++;
			notify();
			System.out.println("producer notify after add apple");
		}
	}
	
	synchronized void removeApple() throws InterruptedException {
		if (count <= 0) {
			System.out.println("customer begin wait");
			wait();
			System.out.println("customer after wait");
		} else {
			System.out.println("customer remove apple");
			count --;
			notify();
			System.out.println("customer notify after remove apple");
		}
	}
}

输出结果:

producer add apple
producer notify after add apple
producer begin wait
customer remove apple
customer notify after remove apple
customer begin wait
producer after wait
producer add apple
producer notify after add apple
producer begin wait
customer after wait
customer remove apple
customer notify after remove apple
customer begin wait
producer after wait
producer add apple
producer notify after add apple
producer begin wait
customer after wait
customer remove apple
customer notify after remove apple
customer begin wait
producer after wait
producer add apple
producer notify after add apple
producer begin wait
customer after wait
customer remove apple
customer notify after remove apple
customer begin wait
producer after wait
producer add apple
producer notify after add apple
producer begin wait
customer after wait
customer remove apple
customer notify after remove apple
customer begin wait
producer after wait

转载于:https://www.cnblogs.com/jerryshao2015/p/4419638.html

Android 12 HAL开发避坑实录:手把手教你用AIDL在Native层实现一个可开机自启动的Service 本文详细介绍了在Android 12 HAL开发中,如何通过AIDL在Native层实现一个可开机自启动的Service。从环境准备、AIDL接口定义、服务实现到VINTF集成与SELinux策略配置,提供了完整的实战指南,帮助开发者避开常见陷阱,提升开发效率。 阅读详情

相关推荐

AMBA VIP基础使用方式(AXI)

AXI环境配置 1)基础配置 作为master或者slave使用时,对应的is_active = 1 只作为i监测(monitor)使用时,对应slave_cfg的is_active = 0(对应端口连接也有所区别) class smu_axi_cfg extends svt_axi_system_configuration; `uvm_object_utils(smu_aix_cfg) function new(string name="smu_axi_cfg); super.new(n..

qq_37573794的博客 7984

Java线程基础(13):wait()和notify()

简介 本文讲解Java中wait()、notify(),通过一个标准的使用实例,来讨论下这两个方法的作用和使用时注意点,这两个方法被提取到顶级父类Object对象中,地位等同于toString()方法。 一、wait()和notify()含义 wait()方法是让当前线程等待的,即让线程释放了对共享对象的锁,不再继续向下执行。 wait(long timeout)方法可以指定一个超时时间,过了这个时间如果没有被notify()唤醒,则函数还是会返回。如果传递一个负数timeout会抛出I...

mingyuli的博客 1万+

模拟滤波器的基础知识和设计

使用Python实现多种模拟滤波器

faltas的博客 3529

java wait与notify方法

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

eve8888888的博客 2万+

微信小程序订阅消息实战:如何绕过长期订阅限制实现多次发送(附PHP代码)

本文针对微信小程序开发者无法获取长期订阅消息权限的痛点,提供了一套完整的实战解决方案。通过深入剖析一次性订阅与长期订阅的规则差异,结合巧妙的交互设计、稳健的PHP服务端发送引擎(含高并发处理与失败重试机制)以及授权池管理等高级策略,帮助开发者在合规前提下,构建高可用的消息推送系统,有效提升通知触达率与用户体验。

weixin_29008805的博客 620

Vivado2023.2与Vitis协同开发:从Hello World到BOOT.BIN的完整流程解析

本文详细解析了使用Vivado 2023.2与Vitis协同开发ZYNQ/MPSoC平台的完整流程。从环境安装、硬件设计、软件编写、在线调试到生成独立的BOOT.BIN启动文件,手把手指导开发者完成从Hello World到系统固化的全步骤,并提供了常见问题的避坑指南,帮助初学者快速掌握软硬件协同开发的核心技能。

weixin_29197051的博客 176

Java多线程基础-7:wait() 和 notify() 用法解析

详解Java多线程编程中,wait()和notify()方法的使用方式和注意事项,配合代码案例~

wyd_333的博客 8414

PyCharm 接入 OpenAI Codex CLI 的 4 步配置与调试实录

揭示 Codex CLI 在 PyCharm 中上下文失稳的四大根源:CLI 启动模式与 IDE 进程模型冲突、stdin/stdout 流式处理不兼容、环境变量污染、AST 注释缺失,并给出基于 Shell 脚本桥接与结构化上下文注入的稳定接入方案。

weixin_42627902的博客 372

Java中的wait和notify方法

java中的wait和notify方法

m0_67683346的博客 2091

matlab计算图像信噪比SNR

【代码】matlab计算图像信噪比SNR。

baidu_34971492的博客 1393

MTK Camera HAL 与 FeaturePipe 架构解析:从硬件抽象到功能管线的工程落地路径

MTK 的 Camera 系统在 Android 平台下采用高度模块化的 HAL 与 FeaturePipe 架构组合,分别承担着底层硬件抽象与上层功能封装的职责。通过将 ISP、3A 算法、Sensor 驱动与图像处理节点解耦封装于功能链条中,联发科平台实现了灵活可控的影像能力调度机制。本文将基于真实项目实践,系统解析 MTK Camera HAL 与 FeaturePipe 架构的设计思路、核心模块与运行机制,结合 AE/AWB/AF 控制流、Buffer 管理策略、功能管线构建方法与多线程调度实现方式

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1570

Java多线程中的 wait() 和 notify() 方法

多线程并发的场景下,有时需要某些线程先执行,这些线程执行结束后其他线程再继续执行, wait()和notify()是Object类的方法,用于线程的等待与唤醒,必须搭配synchronized 锁来使用。

sinat_31583645的博客 4350

【DeepSeek-R1 】分词系统架构解析

DeepSeek-R1 分词系统解析 DeepSeek-R1 采用 SentencePiece Unigram 算法,通过统计语言模型实现高效子词分词。其核心优势包括: 算法对比:相比 BPE/WordPiece,Unigram 基于概率模型,支持多语言,自动回退字符级处理。 特性优化:智能空格处理、数字分桶、多语言统一支持,并采用前缀树索引和 SIMD 并行加速,编码速度达 12,458 tok/s。

赶紧的博客 429

java——wait和notify的基本用法

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

xhhhx_的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JAVA-wait()和notify()

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

Lizhihao_的博客 1552

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java,wait与notify

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

4905

Java中的wait和notify

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

qq_65501447的博客 1320

详解 Java 中的 Wait 和 Notify 机制

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

旧时光 | YoungChen's 博客 2842

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

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

zrwcnm的博客 982

Java EE初阶——wait 和 notify

线程饥饿是指的现象。

2302_80250536的博客 907

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】【基础】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中多线程wait和notify的用法

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

qq_63218110的博客 2776

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

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

Java硬件工程师的博客 2392
上一篇: sql注入原理与实践
下一篇: python基本数据类型
dgit3228
博客等级 码龄12年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值