java Object wait方法详细介绍

java Object wait方法

当线程B访问某个共享资源时,想获取资源的锁对象,发现这个锁已经被线程A拿到了,这个时候,线程B只能被挂起,等待线程A释放锁。

但是拿到锁的线程A在执行的过程中,因为某些条件还不满足,暂时不想继续执行下去,想先等待一下(注意:是已经拿到锁的线程A自己想主动等待的),希望等到某个条件满足后,继续执行任务。在同步代码块里,线程A必须先释放锁,线程B才有资格获取锁,进入同步代码块,执行代码。等线程B执行完后,线程A需要的条件已经满足,那么这个时候必须有一个通知机制,让线程A从等待状态变成执行状态,继续执行代码。

有些同学认为线程A也可以一直循环判断,检查条件是否已经满足,而不一定要中断自己,然后等待。其实这种也是一种思路,但是呢?比较耗CPU,而且也不知道条件何时才能满足。

线程之间要协调沟通,必须有一个等待机制和通知机制,在JAVA里面,对应的就是wait方法和notify方法。

Object的wait方法


synchronized (obj) {
    while (condition does not ok){
      obj.wait();
    }
 }

如果想让线程A处于等待状态,可以调用当前对象wait方法。wait方法一旦被调用,也就意味着:线程A已经获得锁了,而且能做的事情都已经做了,现在只能等待了,等待另外的同步操作执行某些代码后,我才回来继续干活。

注意:

wait方法是定义在根类Object上的,Thread继承自Object类,自然也有wait方法。但是这里并不是调用当前线程对象的wait方法,而是具有锁属性的当前对象的wait方法;这一点我也不太理解,我觉得要做到线程A切换到等待状态,之后被人唤醒,就算使用线程A的wait方法和notify方法其实也是可以做到的,但是估计实现起来非常麻烦。另外从场景上看,wait定义在Object也比较合理,表示线程挂在了对象的等待池中。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Java模拟新浪微博登陆抓取数据

    前言: 兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先: 要想登陆新浪微博需要预登陆,即是将账号base64加密,密码rsa加密以及请求http://login.sina.com.cn/sso/prelogin.php链接获取一些登陆需要参数,返回的接送字符串如: {"retcode":0,"servertime":1487292003,"

  • java 多态性详解及简单实例

    Java中多态性的实现 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 多态的作用:消除类型之间的耦合关系. 现实中,关于多态的例

  • java synchronized加载加锁-线程可重入详解及实例代码

    java synchronized加载加锁-线程可重入 实例代码: public class ReGetLock implements Runnable { @Override public void run() { get(); } public synchronized void get() { System.out.println(Thread.currentThread().getId()); set(); } public synchronized void set() { Syste

  • java生成excel报表文件示例

    此次简单的操作将数据从数据库导出生成excel报表以及将excel数据导入数据库 首先建立数据库的连接池: package jdbc; import java.io.FileInputStream; import java.sql.Connection; import java.util.Properties; import org.apache.commons.dbcp.BasicDataSource; public class BaseDAO { private static BasicDa

  • JAVA通过XPath解析XML性能比较详解

    最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种,一种叫SAX,另一种叫DOM.SAX是基于事件流的解析,DOM是基于XML文档树结构的解析.在此基础上,为了减少DOM.SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量.通常情况下JDOM使用时满足要实现的功能简单,如解析.创建等要求.但在底层,JDOM还是使用SAX(最常用).D

  • java 分布式与集群的区别和联系

    一.先说区别: 一句话:分布式是并联工作的,集群是串联工作的. 1.分布式是指将不同的业务分布在不同的地方. 而集群指的是将几台服务器集中在一起,实现同一业务. 分布式中的每一个节点,都可以做集群. 而集群并不一定就是分布式的. 举例:就比如新浪网,访问的人多了,他可以做一个群集,前面放一个响应服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就将给哪一台去完成. 而分布式,从窄意上理解,也跟集群差不多, 但是它的组织比较松散,不像集群,有一个组织性

  • java中关于转义字符的一个bug

    在java中,你可以定义 char c = '\u4f60'; char m = '\u0045'; char e = '\u554a'; 这样的字面量,例如: System.out.println("\u535a\u5ba2\u56ed"); 这样的代码不管在什么编码环境下都不会出现中文乱码的问题 但是你不能定义这样的字面量: char c = '\u000a'; char m = '\u0027'; 这是因为\u000a和\u0027是特殊转义字符,Java对在字符串字面常量中的U

  • 深入理解java动态代理机制

    retrofit是一个解耦性非常高的网络请求框架,最近在研究的时候发现了动态代理这个非常强大且实用的技术,这篇文章将作为retrofit的前置知识,让大家认识:动态代理有哪些应用场景,什么是动态代理,怎样使用,它的局限性在什么地方? 动态代理的应用场景 1. AOP-面向切面编程,程序解耦 简言之当你想要对一些类的内部的一些方法,在执行前和执行后做一些共同的的操作,而在方法中执行个性化操作的时候--用动态代理.在业务量庞大的时候能够降低代码量,增强可维护性. 2. 想要自定义第三放类库中的某些方

  • java Object wait方法详细介绍

    java Object wait方法 当线程B访问某个共享资源时,想获取资源的锁对象,发现这个锁已经被线程A拿到了,这个时候,线程B只能被挂起,等待线程A释放锁. 但是拿到锁的线程A在执行的过程中,因为某些条件还不满足,暂时不想继续执行下去,想先等待一下(注意:是已经拿到锁的线程A自己想主动等待的),希望等到某个条件满足后,继续执行任务.在同步代码块里,线程A必须先释放锁,线程B才有资格获取锁,进入同步代码块,执行代码.等线程B执行完后,线程A需要的条件已经满足,那么这个时候必须有一个通知机制,

  • java中Object类4种方法详细介绍

    目录 Object(四大方法): hashCode()方法: equals()方法: getClass()方法: toString()方法: 总结 Object(四大方法): 文章干货满满,耐性看完~~何为Object?首先先来看看官方对Object的介绍:在这里附上Java官方的查阅工具:https://docs.oracle.com/en/java/javase/17/docs/api/index.html 由官方介绍可见,object属于Java.lang包内的一个类,而且提供了很多种方法

  • java并发之ArrayBlockingQueue详细介绍

    java并发之ArrayBlockingQueue详细介绍 ArrayBlockingQueue是常用的线程集合,在线程池中也常常被当做任务队列来使用.使用频率特别高.他是维护的是一个循环队列(基于数组实现),循环结构在数据结构中比较常见,但是在源码实现中还是比较少见的. 线程安全的实现 线程安全队列,基本是离不开锁的.ArrayBlockingQueue使用的是ReentrantLock,配合两种Condition,实现了集合的线程安全操作.这里稍微说一个好习惯,下面是成员变量的声明. pri

  • Java多线程的用法详细介绍

    Java多线程的用法详细介绍 最全面的Java多线程用法解析,如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法. 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); publi

  • 重写hashCode()和equals()方法详细介绍

    hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equals()方法 如果你决定要重写equals()方法,那么你一定要明确这么做所带来的风险,并确保自己能写出一个健壮的equals()方法.一定要注意的一点是,在重写equals()后,一定要重写hashCode()方法.具体原因稍候再进行说明. 我们先看看 JavaSE 7 Specification中

  • fastjson 使用方法详细介绍

    Fastjson介绍 Fastjson是一个Java语言编写的JSON处理器. 1.遵循http://json.org标准,为其官方网站收录的参考实现之一. 2.功能qiang打,支持JDK的各种类型,包括基本的JavaBean.Collection.Map.Date.Enum.泛型. 3.无依赖,不需要例外额外的jar,能够直接跑在JDK上. 4.开源,使用Apache License 2.0协议开源.http://code.alibabatech.com/wiki/display/FastJ

  • Java规则引擎easy-rules详细介绍

    目录 简介 开始使用 引入依赖 定义规则 使用注解定义规则 使用RuleBuilder定义规则 组合规则 规则优先级 Rules API 定义事实 定义规则引擎 创建规则引擎 规则引擎参数 定义规则监听器 定义规则引擎监听器 表达式语言(EL)支持 EL提供者注意事项 通过编程的方式定义规则 通过规则描述文件定义规则 规则定义中的错误处理 实际栗子 最近在思考一个基于规则进行挑选的技术重构,想通过规则引擎进行实现,借着这个机会正好可以详细了解一下规则引擎.本篇文章将会详细介绍规则引擎easy-r

  • Java中CompletableFuture 的详细介绍

    目录 1.概述 1.0 创建 CompletableFuture 的对象的工厂方法 1.1 non-async 和 async 区别 1.1.1 non-async 示例:注册 action 的时候任务可能已经结束 1.1.2 non-async 示例:注册 action 的时候任务未完成 1.2 Run 类方法 1.3 Accept 类方法 1.4 Apply 类方法 2 单个任务执行完成后执行一个动作(action) 2.0 示例 exceptionally 3 两个任务执行编排 4 多个任

  • Java AOP动态代理详细介绍

    目录 1.IOC与AOP概念 2.为何使用动态代理 2.1 JDK原生动态代理 2.1.1 MathService接口类 2.1.2 MathServiceImpl实现接口类 2.1.3 ProxyFactory动态代理工厂 2.1.4 测试类 2.2 cglib动态代理 2.2.1 MathServiceImpl类 2.2.2 ProxyFactory动态代理工厂 2.2.3 测试类 3.AOP动态代理 3.1 添加对应依赖 3.2 配置spring.xml文件 3.3 MathService

  • SpringCloud Gateway DispatcherHandler调用方法详细介绍

    目录 前言 DispatcherHandler类声明 handle方法 最后总结一下 前言 之前几节我们分析了请求是如何调用到HttpWebHandlerAdapter的,然后再调用到DispatcherHandler中,通过handle方法来处理具体的请求. DispatcherHandler的注入在自动装配那一节已经说过了,忘记的同学可以重新会看一下. DispatcherHandler类声明 public class DispatcherHandler implements WebHand

随机推荐