notify() 和 notifyAll() 有什么区别?「建议收藏」

notify() 和 notifyAll() 有什么区别?「建议收藏」notify()和notifyAll()有什么区别?先解释两个概念。等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池,等待池中的线程不会去竞争该对象的锁。 锁池:只有获取了对象的锁,线程才能执行对象的synchronized代码,对象的锁每次只有一个线程可以获得,其他线程只能在锁池中等待区别:notify()…

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

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

notify() 和 notifyAll() 有什么区别?

先解释两个概念。

  • 等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池,等待池中的线程不会去竞争该对象的锁。
  • 锁池:只有获取了对象的锁,线程才能执行对象的 synchronized 代码,对象的锁每次只有一个线程可以获得,其他线程只能在锁池中等待

区别:

notify() 方法随机唤醒对象的等待池中的一个线程,进入锁池;notifyAll() 唤醒对象的等待池中的所有线程,进入锁池。

测试代码

public class TestNotifyNotifyAll {

	private static Object obj = new Object();
	
	public static void main(String[] args) {
		
		//测试 RunnableImplA wait()        
		Thread t1 = new Thread(new RunnableImplA(obj));
		Thread t2 = new Thread(new RunnableImplA(obj));
		t1.start();
		t2.start();
		
		//RunnableImplB notify()
		Thread t3 = new Thread(new RunnableImplB(obj));
		t3.start();
		
		
//		//RunnableImplC notifyAll()
//		Thread t4 = new Thread(new RunnableImplC(obj));
//		t4.start();
	}
	
}


class RunnableImplA implements Runnable {

	private Object obj;
	
	public RunnableImplA(Object obj) {
		this.obj = obj;
	}
	
	public void run() {
		System.out.println("run on RunnableImplA");
		synchronized (obj) {
			System.out.println("obj to wait on RunnableImplA");
			try {
				obj.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("obj continue to run on RunnableImplA");
		}
	}
}

class RunnableImplB implements Runnable {

	private Object obj;
	
	public RunnableImplB(Object obj) {
		this.obj = obj;
	}
	
	public void run() {
		System.out.println("run on RunnableImplB");
		System.out.println("睡眠3秒...");
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		synchronized (obj) {
			System.out.println("notify obj on RunnableImplB");
			obj.notify();
		}
	}
}

class RunnableImplC implements Runnable {

	private Object obj;
	
	public RunnableImplC(Object obj) {
		this.obj = obj;
	}
	
	public void run() {
		System.out.println("run on RunnableImplC");
		System.out.println("睡眠3秒...");
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		synchronized (obj) {
			System.out.println("notifyAll obj on RunnableImplC");
			obj.notifyAll();
		}
	}
}

结果:仅调用一次 obj.notify(),线程 t1 或 t2 中的一个始终在等待被唤醒,程序不终止

run on RunnableImplA
obj to wait on RunnableImplA
run on RunnableImplA
obj to wait on RunnableImplA
run on RunnableImplB
睡眠3秒...
notify obj on RunnableImplB
obj continue to run on RunnableImplA

 把 t3 注掉,启动 t4 线程。调用 obj.notifyAll() 方法

public class TestNotifyNotifyAll {

	private static Object obj = new Object();
	
	public static void main(String[] args) {
		
		//测试 RunnableImplA wait()        
		Thread t1 = new Thread(new RunnableImplA(obj));
		Thread t2 = new Thread(new RunnableImplA(obj));
		t1.start();
		t2.start();
		
//		//RunnableImplB notify()
//		Thread t3 = new Thread(new RunnableImplB(obj));
//		t3.start();
		
		
		//RunnableImplC notifyAll()
		Thread t4 = new Thread(new RunnableImplC(obj));
		t4.start();
	}
	
}

 

 结果:t1、t2线程均可以执行完毕

run on RunnableImplA
obj to wait on RunnableImplA
run on RunnableImplA
obj to wait on RunnableImplA
run on RunnableImplC
睡眠3秒...
notifyAll obj on RunnableImplC
obj continue to run on RunnableImplA
obj continue to run on RunnableImplA

 


【Java面试题与答案】整理推荐

 

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

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

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


相关推荐

  • 共享内存函数(shmget、shmat、shmdt、shmctl)及其范例

    共享内存函数(shmget、shmat、shmdt、shmctl)及其范例共享内存函数由 shmget shmat shmdt shmctl 四个函数组成 下面的表格列出了这四个函数的函数原型及其具体说明 1 nbsp shmget 函数原型 shmget 得到一个共享内存标识符或创建一个共享内存对象 所需头文件 include includ

    2026年3月17日
    2
  • QGridLayout中multi cell处理

    QGridLayout中multi cell处理

    2021年7月25日
    64
  • 百度發表Ernie X1以與DeepSeek R1競爭

    百度發表Ernie X1以與DeepSeek R1競爭

    2026年3月12日
    2
  • WebStorm-2021安装教程

    WebStorm-2021安装教程下载直接到官网下载 安装 1 找到下载的 exe 右键以管理员身份运行 next2 选择安装位置 next3 勾选如图 next install4 finish 桌面出现快捷方式图标 至此 webstorm 的安装已经完成 激活 1 找到桌面快捷方式图标 右键 以管理员身份运行 如下图 ok2 选择激活码方式激活 3 打开网址 这个网址里面有最新的激活码 ps 笔者也是四处搜寻 然后找到的 至于后面有没有 个人概不负责 复制激活码 active continue4 激活

    2026年3月19日
    2
  • AWVS的简单使用

    AWVS的简单使用其实 AWVS 使用很简单 由于 AWVS11 x 及以上版本都是以网页的形式展示的 虽然说是英文的 不过没关系 我们完全可以用 网页翻译 插件直动翻译成中文 那样使用起来就简单多了 大家一看就能明白 1 启动 AWVS 以 AWVS11 x 为例子 windows R 输入 services msc 打开服务对话框 启动 Acunetix 与 AcunetixData 服务 单击右键启动一下即可 2 登录 AWVS 打开 https localhost 3443 输入用户名和密码 账

    2026年3月16日
    2
  • 数据结构——学习笔记——入门必看【建议收藏】

    数据结构——学习笔记——入门必看【建议收藏】什么是数据结构 是数据之间存在一种或多种特定关系的数据元素集合为编写出一个 好 的程序 必须分析待处理对象的特性及各处理对象之间存在的关系这也就是研究数据结构的意义所在第一章 数据结构绪论 1 什么是程序程序 数据结构 算法 2 逻辑结构 amp 物理结构的区别用法 https blog csdn net liu article

    2026年3月26日
    3

发表回复

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

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