java线程间同步----wait、notify、synchronized

一、wait、notify

wait、notify 是java 根级父类Obeject 中定义得两个方法,其相关作用如下:
object.wait():执行该语句,会让获取了该object对象锁得线程进入WAIT状态,并释放该object对象锁;
object.notify():执行该语句,会唤醒此object对象监视器上等待的单个线程,但是并不会释放锁,而是会继续执行剩余语句,直到执行完synchronized块,才会释放object对象锁;
object.notifAll():同上,但是会唤醒此对象监视器上等待的所有线程;

二、代码实践

WaitThread

public class WaitThread extends Thread {
	private final Object lock;

    public WaitThread(Object lock) {
        super();
        this.lock = lock;
    }
    @Override
    public void run() {
    	System.out.println("this is wait");
        try {
            synchronized (lock) {
                long start = System.currentTimeMillis();
                System.out.println("开始 wait time= " + start);
                lock.wait();
                long end = System.currentTimeMillis();
                System.out.println("结束 wait time= " + end);
                System.out.print("wait time = " + (end - start));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

NotifyThread

public class NotifyThread extends Thread  {
	
	private final Object lock;

    public NotifyThread(Object lock) {
        super();
        this.lock = lock;
    }
    @Override
    public void run() {
    	System.out.println("this is notify");
        synchronized (lock) {
  
            try {
                Thread.sleep(3000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 业务逻辑完成了...
            System.out.println("开始 notify time= " + System.currentTimeMillis());
            lock.notify();
            try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            System.out.println("结束 notify time= " + System.currentTimeMillis());
        }
    }

}

main

public class Main {
	
	public static void main(String[] args) {
		
		Object lock = new Object();
        WaitThread t1 = new WaitThread(lock);
        t1.start();
        NotifyThread t2 = new NotifyThread(lock);
        t2.start();		
	}
}

执行结果

this is wait
this is notify
开始 wait time= 1713457641122
开始 notify time= 1713457644123
结束 notify time= 1713457654137
结束 wait time= 1713457654137
wait time = 13015

代码逻辑简介

  • 1、主线程创建了两个线程WaitThread t1 和 NotifyThread t2 并运行着两个线程;
  • 2、线程WaitThread t1先获取lock 同步锁,然后 NotifyThread t2只能等待;
  • 3、线程WaitThread t1获取锁之后执行相关代码,直到object.wait(),WaitThread t1进入等待状态,并释放锁;
  • 4、锁一释放,NotifyThread t2 就会获取该对象得同步锁,并执行后续代码;
  • 5、NotifyThread t2线程执行到object.wait(),该语句可以唤醒因object.wait()而处于WAIT状态得线程WaitThread t1,但是此时锁并没有释放,所以WaitThread t1会继续等待锁;直到NotifyThread t2的synchronized模块执行完成,才会释放锁;此时WaitThread t1会获取锁并继续执行,直到线程执行完毕;
  • 相关流程如下图:
    在这里插入图片描述

三、问题

1、notify()是依据什么唤醒等待线程的,即wait()和notify()之间是通过什么相互关联的?

对象的同步锁,即synchronized锁

2、为什么notify().wait()等函数方法定义在Object类中,而不是定义在Thread类中?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/559830.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

同旺科技 USB TO SPI / I2C适配器读写24LC256--字节写

所需设备: 1、USB 转 SPI I2C 适配器;内附链接 2、24LC256芯片 适应于同旺科技 USB TO SPI / I2C适配器升级版、专业版; 00地址写入一个字节数据AA,并读回验证; 单字节写时序: 读字节时序: …

OpenCV——透视变换

前言 ​ 需求: 将一个梯形变为需要的图形,后续需要持续进行映射。让整张图像的所有点位都按照这样的映射关系进行映射。 正文 一、透视变换相关介绍 从名称中可以清楚地看出,透视变换研究是坐标变化之间的关系。这种类型的转换不保留信息…

数据采集技术综合项目实战3(网络爬虫+数据预处理+数据可视化)附带详细步骤说明,干货满满

项目介绍及需求: 本项目主要是通过对b站电影弹幕进行采集并分析。1.获得弹幕高频词生成符合该电影特征、主题、角色等相关字段的词云图,通过词云图的方式对某部电影主题具体化。2.获取用户年内评论发布时间观生成时间的折线图,以便从侧面观察…

HarmonyOS-静态库(SDK)的创建和使用

文章目录 一、静态库(SDK)二、创建静态库1.新建静态库模块2. 开发静态库内容3. 编译静态库 三、使用静态库1. 配置项目依赖2. 在应用中使用静态库3. 注意事项 四、打包错误1. library引用本地har包错误 一、静态库(SDK) 在Harmon…

【35分钟掌握金融风控策略6】决策树风控策略开发

目录 ​编辑 决策树 决策树原理 决策树生成 特征选择 决策树生成 决策树剪枝 决策树 决策树(Decision Tree)是一种强大的分类和预测方法,因其实践起来比较简单且具有较好的解释性,所以在金融风控领域应用广泛。决策树也是…

如何快速提高阿里国际、Shopee和速卖通产品的曝光率?

当卖家完成产品上传后,他们还能做些什么来进一步提升产品的曝光量呢?产品的曝光量无疑对店铺的销量具有显著影响,那么,如何有效地提升产品曝光量呢?又有哪些快速且实用的方法呢?今天,我们就来深…

【力扣 Hot100 | 第五天】4.20(回文链表)

1.回文链表 1.1题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例一: 输入:head [1,2,2,1] 输出:true示例二: 输入…

智慧城市标准化白皮书(2022版)发布

2022年7月25日,国家智慧城市标准化总体组2022年度全体会议召开期间,《智慧城市标准化白皮书(2022版)》正式发布。 城市作为一个复杂巨系统,是多元主体融合及多元活动集聚的复杂综合体。城市的运行发展关联 到发展、治…

康耐视visionpro-Cog2DSymbolTool操作操作工具详细说明

Cog2 DSymbolToolI功能说明: 二维码读取工具 Cog2 DSymbolTool操作说明: ①.打开工具栏,双击或点击鼠标拖拽添加Cog2DSymbolTool工具 ②.添加输入图像,右键“链接到”或以连线拖拽的方式选择相应输入图像。 ③.代码系统&#x…

Pytest精通指南(22)钩子函数-重复执行(pytest-repeat)

文章目录 前言应用场景插件安装参数分析使用方式一:命令行使用方式二:配置文件使用方式三:装饰器 前言 pytest框架中的**重复测试(pytest-repeat)**插件的用途是允许在运行测试用例时进行多次循环,以更全面…

2024年开通最新版云开发cms步骤,开始开发微信小程序前的准备工作,认真看完奥!

小程序官方有改版了,搞得石头哥不得不紧急的再新出一版,教大家开通最新版的cms网页管理后台 一,技术选型和技术点 1,小程序前端 wxml css JavaScript MINA原生小程序框架 2,数据库 云开发 云数据库 云…

中毒的电脑插U盘也会中毒吗?U盘中毒了不显示数据怎么办

随着数字技术的快速发展,U盘作为数据存储和传输的重要工具,广泛应用于我们的日常生活和工作中。然而,U盘在带来便利的同时,也带来了潜在的安全风险。当一台中毒的电脑插入U盘时,U盘是否也会被感染?如果U盘中…

PHP 爬虫如何配置代理 IP(CURL 函数)

在 PHP中 配置代理IP&#xff0c;可以通过设置 CURL 库的选项来实现&#xff0c;代码如下&#xff1a; 当然你要有代理ip来源&#xff0c;比如我用的这个 代理商 &#xff0c;如果想服务稳定不建议找开源代理池&#xff0c;避免被劫持。 <?php // 初始化cURL会话 $ch cu…

C++中的stack(容器适配器)

目录 一、成员函数 一、构造函数 二、入栈 三、出栈 四、判空 empty () 五、栈大小 size 六、取栈顶元素 top 七、入栈 emplace 八、交换函数 swap 二、非成员函数重载 一、关系运算符重载 二、交换函数 C中的stack不再是容器&#xff0c;而是容器适配器 注意&a…

[InternLM训练营第二期笔记]4. XTuner 微调 LLM:1.8B、多模态、Agent

该系列是上海AI Lab举行的书生 浦语大模型训练营的相关笔记部分。 该笔记是第四节课&#xff0c;学习大语言模型微调的基本概念&#xff0c;以及利用XTuner工具进行微调。 0. 什么是LLM中的微调 0.1 两种Finetune范式 微调的目的是为了让foundation模型在特定的领域更好地发挥…

力扣练习题(2024/4/18)

1不相交的线 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff08;非水平线…

mysql按季度统计数据

最近遇到按表里得交付时间换成季度取统计&#xff0c;如下&#xff1a; select sp.Id,sp.title,QUARTER(sp.expected_delivery_time) dateStr,CONCAT(DATE(MIN(sp.expected_delivery_time)),至,DATE(MAX(sp.expected_delivery_time))) dateStr2,sp.DemandType,sp.IndustryGrou…

【人工智能基础】状态空间搜索

状态空间法 状态空间&#xff1a;一个问题全部可能的状态以及其关系的集合。 状态空间图&#xff1a;以图的形式表示问题的状态空间&#xff0c;节点对应状态&#xff0c;边对应状态转移算子&#xff0c;边上的权对应转移所需的代价 问题的解&#xff1a;是从最开始状态到目…

BP使用和弱口令漏洞

目录 一、BP使用 1.BP设置 2.Proxy 3.Reapter 4.Decord 5.Intruder 二、弱口令爆破 1.服务弱口令爆破 2.验证码绕过 一、BP使用 1.BP设置 设置代理的监听端口: 这里设置为本机的9090端口 2.Proxy 浏览器要挂代理&#xff0c;设置为本机的9090端口 打开拦截功能 当浏览…

Youtube DNN

目录 1. 挑战 2. 系统整体结构 3.召回 4. 排序 5. 训练和测试样本的处理 1. 挑战 &#xff08;1&#xff09;规模。很多现有的推荐算法在小规模上效果好&#xff0c;但Youtobe规模很大。 &#xff08;2&#xff09;新颖度。Youtobe语料库是动态的&#xff0c;每秒都会有…