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


相关推荐

  • 计算机毕业设计net作业管理系统(系统+数据库+源码+文档)

    计算机毕业设计net作业管理系统(系统+数据库+源码+文档)计算机毕业设计net作业管理系统(系统+数据库+源码+文档)net作业管理系统计算机毕业设计最新计算机专业原创开发毕业设计参考选题都有源码+数据库是近期作品【1】 jsp科技专业师生沟通平台 【2】 ssm电商平台客流统计系统 【3】 JSP物流仓储仓库管理系统的设计与实现sqlserver 【4】 ssm大学生家教管理系统 【5】 ssm图书管理系统 【6】 ssm医院患者管理系统 【7】 班级信息管理系统 【8】

    2022年6月5日
    23
  • Drupal教程之安装篇

    Drupal教程之安装篇星期一,01/12/2009—似曾相识文章地址:[url]http://www.drupaluser.org/node/3[/url]象许多CMS一样,Drupal也是需要安装,其主要步骤如下(以[url]http://drupaluser.org/[/url]为例):1.在[url]http://drupaluser.org/[/u…

    2022年6月8日
    26
  • oracle恢复几天前的数据,恢复oracle数据到以前的某个时间点

    oracle恢复几天前的数据,恢复oracle数据到以前的某个时间点今天下午发现oracle数据库的参数表不知道被谁执行的语句都没有加条件,所以整个数据都乱了,不能用,查到了一下午,找到了几个解决办法,记录在此。一、执行如下SQL将test_temp表中的数据恢复到2014052811:00:00注意,这里一定要先删除全部数据,否则可能会导致数据重复deletefromtest_tmp;insertintotest_tmpselect*fro…

    2022年7月17日
    14
  • Ubuntu 使用Compiz配置炫酷3D桌面

    Ubuntu 使用Compiz配置炫酷3D桌面先看一下效果要实现这种3D的效果其实很简单.Step1:安装N卡驱动工具sudoapt-getinstallnvidia-331这个东西其实没有太大的作用.Step2:安装Compizsu

    2022年7月2日
    23
  • 用好系统安全模式让电脑更安全

    用好系统安全模式让电脑更安全

    2021年8月6日
    54
  • pycharm学生怎么免费使用_pycharm学生延期

    pycharm学生怎么免费使用_pycharm学生延期首先登陆到官网:点击Buy-> 选择 DISCOUNTEDANDCOMPLIMENTARYLICENSES,你会看到下面的内容freeforstudentandteachers,opensourceproject非盈利组织50%等,在这里,如果你是学生的话,点进去有两种获取激活码的方式,一种是有校内邮箱,一种是ISICcard,国际学生证。一般在…

    2022年8月28日
    9

发表回复

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

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