我的编程空间,编程开发者的网络收藏夹
学习永远不晚

聊聊Object类中的wait()和notify()方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

聊聊Object类中的wait()和notify()方法

Object类中的wait()和notify()方法

一、特点

wait()和notify()方法并不是线程对象的方法,是Java中任何一个Java对象都有的方法,并不特殊。

二、wait()方法的作用


Object obj = new Object();
obj.wait();

表示:obj.wait();方法的调用,会让“当前线程(正在obj对象上活动的线程)”进入等待状态。

三、notify()方法的作用


Object obj = new Object();
obj.notify();

表示:唤醒正在obj对象上等待的线程。

补充:


Object obj = new Object();
obj.notifyAll();

表示:唤醒正在obj对象上等待的所有线程。

四、wait()和notify()的使用

wait()和notify()方法都是建立在synchronized线程同步的基础之上

重点

obj.wait()方法会让正在obj对象上活动的当前线程进入等待状态,并且释放之前占有的obj对象的锁。

obj.notify()方法只会通知,不会释放之前占有的obj对象的锁。

object中的wait和notify细节

wait

jdk源码:

在这里插入图片描述

重点看下划线的地方,是不是有些不理解。有个印象我们继续往下看。


public class resourse {
    private Integer number = 0 ;
    
    public synchronized void  produce () throws Exception
    {
//        判断  这里用while 用if多与两个线程容易出错
//        不等于0就要等待消费者消费完
         if(number!=0)
         {
             this.wait();
         }
//         干活
        number++;
        System.out.println(Thread.currentThread().getName() + "的资源数为:" + number.toString());
//        释放
        this.notifyAll();
    }
//wait操作会释放锁
    public synchronized void consumer () throws Exception
    {
        //    等于零就要等待生产者生产
        if (number == 0)
        {
            this.wait();
        }
//        消费
        number--;
        System.out.println(Thread.currentThread().getName() + "的资源数为:" + number.toString());
//        释放
        this.notifyAll();
    }
}

调用者。这里开启了两个生产者和两个消费者线程。生产者线程都执行100次的produce,消费者线程都执行100次的consumer


public class main {
    public static void main (String[] args) {
        resourse resourse = new resourse();
            new Thread(()->{
                try{
                    for (int i=0 ; i<100;i++)
                    resourse.produce();
                }catch (Exception e)
                {
                    e.printStackTrace();
                }
            }).start();
        new Thread(()->{
            try{
                for (int i=0 ; i<100;i++)
                resourse.produce();
            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }).start();
        new Thread(()->{
            try{
                for (int i=0 ; i<100;i++)
                    resourse.consumer();
            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }).start();
        new Thread(()->{
            try{
                for (int i=0 ; i<100;i++)
                resourse.consumer();
            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }).start();
    }
}

我要说的重点是:

在这里插入图片描述

这样设计真的合理吗?

jdk中为啥要规定我们要使用while,而不是if?

用if为啥不行

1:首先一点我们要搞清楚 wait操作会释放锁

2:想想这种情况,当一个生产者线程执行的时候 if number!=0 (此时的number为1 ) 就会发生阻塞 这时候释放出锁 这时候又一个生产者进程进来又会被wait住.然后一个生产者进程进来,消费了一个 但是notifyall 将所有的进程都解开了 。。那两个生产者进程就会直接运行if后面的东西并没有被拉回来重新判断一下。这样就造成了number的值变成2.同理number变成负数也是有可能的(两个消费者进程先进来都堵塞).

这个问题绝对是干货,在工作中绝对会遇到生产者消费者问题,不少程序员会在这个地方踩坑。面试的时候如果考到你这个地方,你能解答出深层原理来。相信面试官会高看你一眼。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

聊聊Object类中的wait()和notify()方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java 中Object的wait() notify() notifyAll()方法使用

Java 中Object的wait() notify() notifyAll()方法使用一、前言  对于并发编程而言,除了Thread以外,对Object对象的wati和notify对象也应该深入了解其用法,虽然知识点不多。二、线程安全基本
2023-05-31

一文聊聊Vue中provide和inject的使用方法

Vue中如何使用provide与inject?下面本篇文章就来给大家介绍一下Vue中provide和inject的使用方法,希望对大家有所帮助!
2023-05-14

聊聊uniapp中退出登录的方法

UniApp 是一款跨平台的开发框架,可用于构建 iOS、Android、H5 等多个平台的应用程序,开发者使用 UniApp 开发应用时,可能会遇到需要退出登录的情况。本篇文章将介绍 UniApp 中退出登录的方法。1. 清空本地存储退出登录时,最简单的方法就是清空本地存储,这样就可以避免用户在退出登录后,再次打开应用时恢复到之前的登录状态。清空本地存储可使用 uni.rem
2023-05-14

聊聊Git的使用方法和注意事项

作为程序员和开发人员必备的版本控制工具,Git已经成为了主流。但是,很多人在使用 Git 时常常会遇到一些问题,比如常见的 Git 命令不知道该如何使用、出现冲突怎么办等等。那么,本文就为大家介绍一下 Git 的使用方法和注意事项,帮助大家
2023-10-22

JUC中的wait与notify方法实现原理详解

这篇文章主要介绍了JUC中的wait与notify方法实现原理,在进行wait()之前,就代表着需要争夺Synchorized,而Synchronized代码块通过javap生成的字节码中包含monitor enter和monitor exit两个指令
2023-03-10

聊聊uniapp同步方法的使用方法和注意事项

UniApp是一款跨平台的应用程序开发框架,由于其具有良好的跨平台特性,因此在移动应用程序开发领域中备受欢迎。UniApp的特点之一就是允许开发者使用JavaScript编写同步方法。那么,何为uniapp同步方法,如何使用?一、uniapp同步方法的定义uniapp同步方法指的是在uniapp框架中,开发者使用JavaScript编写的同步代码块。同步代码块是指,该代码块会阻
2023-05-14

聊聊jquery中隐藏表单字段的方法

jQuery是一种广泛使用的JavaScript库,它被用来简化常见的客户端脚本任务。其中一个常见的任务是隐藏表单字段。这篇文章将介绍如何使用jQuery来隐藏表单字段。首先,要隐藏一个表单字段,需要使用CSS中的"display"属性。这个属性有几个选项,其中包括"none",它将元素完全隐藏。有几种方法可以使用jQuery来设置一个元素的"display"属性为"none"
2023-05-14

聊聊gitlab不可见的原因和解决方法

在软件开发领域,版本控制系统是一个必不可少的工具,而Git则是其中最知名且最强大的版本控制系统之一。而在Git之上,GitLab则是一个建立在Git之上的完整的开发工具,它提供了仓库管理、Issue管理、持续集成、代码审查等多种功能,被广泛
2023-10-22

聊聊JavaScript中实现继承的6种方法

JavaScript中怎么实现继承?下面本篇文章给大家分享JS实现继承的6种方法,希望对大家有所帮助!
2022-11-22

聊聊Git上中文问题的解决方法

标题:作为一种流行的分布式版本控制系统,Git已经成为了很多开发者的首选工具。然而,在使用Git过程中,有一些中文相关的问题会让一部分用户感到困惑。本文将介绍Git中的中文问题,并给出解决方法。一、Git的默认编码在Git中,默认使用的编码
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录