精华内容
下载资源
问答
  • 什么wait方法在object类中,sleep方法在Thread类中
    千次阅读
    2014-07-04 17:42:18

    今天面试问到了这个问题,没有回答上来。在网上找了一下,发现说的非常清楚。所以保存下来了……


    这两者的施加者是有本质区别的. 
    sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制. 


    而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处 继续执行. 


    其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题


     在java.lang.Thread类中,提供了sleep(),
    而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程
    sleep()可以将一个线程睡眠,参数可以指定一个时间。
    而wait()可以将一个线程挂起,直到超时或者该线程被唤醒。
        wait有两种形式wait()和wait(milliseconds).
    sleep和wait的区别有:
      1,这两个方法来自不同的类分别是Thread和Object
      2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
      3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
        任何地方使用
       synchronized(x){
          x.notify()
         //或者wait()
       }
       4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

    更多相关内容
  • 什么wait,notify,notifyAll声明在类Object中而不是Thread这个问题是一个非常有名的java核心面试题,各种级别的Java开发者面试中都会出现

    多线程概述

    Java是一个支持多线程的开发语言,多线程并发执行任务可以充分利用CPU资源,提高多任务并发执行效率(注意区分:多线程并不会加快任务的执行速度,而是可以充分利用多核CPU让线程轮流进行工作,达到了一种“同时”工作的效果)。

    并发时的产生问题

    多线程在执行时,会遇到一些问题,问题的关键原因则是在共享资源的更新操作上容易产生冲突。

    解决的方向

    解决冲突的方式则是从共享资源的占用机制入手,保证共享资源同一时刻只能被一个线程占用,从而达到数据一致。

    具体实现方式中的一种

    在Java中提供了synchorinzed关键字,在该关键字修饰的代码内,称为同步代码块,线程执行该区域代码需要获取锁,在获取成功之后,其他线程需要等该线程执行完毕释放锁之后才能获取到。

    wait、notify、notifyAll方法的作用

    在同步代码块中,可以使用wait、notify来控制当前占用资源的线程进入阻塞队列与唤醒进入就绪队列
    也就是说,上述两个方法实际上实现的时线程之间的通信机制,用来通知线程的阻塞与唤醒。

    引出问题:为什么定义在Object中而不是Thread类

    线程为了进入临界区(也就是同步块内),需要获得锁并等待锁可用,它们并不知道也不需要知道哪些线程持有锁,它们只需要知道当前资源是否被占用,是否可以获得锁,所以锁的持有状态应该由同步监视器来获取,而不是线程本身。

    一个比喻

    形象的比喻:一个女孩子同时被10个男孩子追,在同一个时间段内只能陪一个男孩子看电影,当其中一个男孩想要邀请女孩看电影时,应该由女孩子来通知男孩子,这个时间段可不可以赴约,而不应该是男孩子询问其他情敌抑或是由情敌之间相互通知谁该去赴约(那还不打起来了)。
    例子中女孩相当于”共享资源“(每一个男孩机会均等),在Java中是一个对象,男孩子们相当于线程,多个线程之间的通信机制,由共享资源(就是前文所说的同步监视器)来实现,即将wait、notify、notifyAll方法定义在Object中是最合理的

    较详细的解释

    以下是一篇英文博客的翻译:
    为什么它们不应该在Thread类,(我)的一些想法是:

    1. wait和nofity不是常见的普通java方法或同步工具,在Java中它们更多的是实现两个线程之间的通信机制。
      如果不能通过类似synchronized这样的Java关键字来实现这种机制,那么Object类中就是定义它们最好的地方,以此来使任何Java对象都可以拥有实现线程通信机制的能力。
      记住synchronized和wait,notify是两个不同的问题域,并且不要混淆它们的相似或相关性。 同步类似竞态条件,是提供线程间互斥和确保Java类的线程安全性的,而wait和notify是两个线程之间的通信机制。

    2. 另一个原因:每个对象都可以作为锁

    3. 在Java中,为了进入临界区代码段,线程需要获得锁并且它们等待锁可用,它们不知道哪些线程持有锁而它们只知道锁是由某个线程保持,它们应该等待锁而不是知道哪个线程在同步块内并要求它们释放锁。 这个比喻适合等待和通知在object类而不是Java中的线程。

    这些只是我的想法为什么wait和notify方法在Object类中声明,而不是Java中的Thread,当然你可以有不同的观点。

    在现实中,它就是Java不支持操作符重载一样,只是Java设计者做的一个设计决定。 无论如何,如果你有任何其它令人信服的理由请发布出来。

    还有一点需要注意:wait、notify、notifyAll方法只能在同步代码块中使用,在非同步代码块中会导致异常

    因为只有在同步代码块中才会涉及到锁的概念,在非并发环境下尝试操作锁会导致失败。

    展开全文
  • 什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread类中 因为java每个对象都有一把称之为monitor监控器的锁 由于每个对象都可以上锁,这就要求对象头有一个用来保存锁信息的位置 这个锁是...

    为什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread类中

    因为java中每个对象都有一把称之为monitor监控器的锁
    由于每个对象都可以上锁,这就要求在对象头中有一个用来保存锁信息的位置
    这个锁是对象级别的,而非线程级别的,wait/notify/notifyAll也都是锁级别的操作,
    他们的锁属于对象
    所以把他们定义在Object类中最合适,因为Object类是所有对象的父类
    
    因为如果把wait/notify/notifyAll方法定义在Thread类中,会带来很大的局限性
    比如一个线程可能持有多把锁,以便实现相互配合的复杂逻辑,假设此时wait方法定义到Thread类中
    如何实现让一个线程持有多把锁呢?又如何明确线程等待的是那把锁呢?
    既然我们是让当前线程去等待某个对象的锁,自然应该通过操作对象来实现,而不是操作线程
    

    wait/notify和sleep方法的异同

    相同点
    1.他们都可以让线程阻塞
    2.它们都可以响应interrupt中断:在等待的过程中如果收到中断信号,都可以进行响应,
    并抛出InterruptedException
    不同点
    1.wait方法必须在synchronized保护的代码中使用,而sleep方法并没有这个要求
    2.在同步代码中执行sleep方法时,并不会释放monitor锁,但执行wait方法时会主动释放monitor锁
    3.sleep方法中要求必须定义一个时间,时间到期后会主动恢复,而对于没有参数wait方法而言,意味着永久等待,直到被中断或者唤醒才能恢复,他并不会主动恢复
    4.wait/notify是Object方法,而sleep是Thread类的方法
    
    展开全文
  • JavaObject类

    万次阅读 多人点赞 2019-05-11 14:54:16
    Object作为所有的父类,是面向对象学习最重要的一个Object类是java默认的提供的一个Object类是所有的父类,也就是说任何一个定义的时候如果没有明确的继承一个父类的话,那么它就是Object的子类

    一. Object类简介

    Object类是Javajava.lang包下的核心类,Object类是所有类的父类,何一个类时候如果没有明确的继承一个父类的话,那么它就是Object的子类;

    以下两种类的定义的最终效果是完全相同的:

    class Person { }
    
    class Person extends Object { }
    

    使用Object类型接收所有类的对象
    在这里插入图片描述

    Object 类属于java.lang包,此包下的所有类在使用时无需手动导入,系统会在程序编译期间自动导入

    Object 类的结构图(Object提供了11 个方法)
    在这里插入图片描述
    下面我们一个个方法进行分析,看这些方法到底有什么作用:

    1. clone()

    保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。

    2. getClass()

    final方法,返回Class类型的对象,反射来获取对象。

    3. toString()

    该方法用得比较多,一般子类都有覆盖,来获取对象的信息。

    4. finalize()

    该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。

    5. equals()

    比较对象的内容是否相等

    6. hashCode()

    该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。

    7. wait()

    wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

    调用该方法后当前线程进入睡眠状态,直到以下事件发生。

    1. 其他线程调用了该对象的notify方法。
    2. 其他线程调用了该对象的notifyAll方法。
    3. 其他线程调用了interrupt中断该线程。
    4. 时间间隔到了。

    此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

    8. notify()

    该方法唤醒在该对象上等待的某个线程。

    9. notifyAll()

    该方法唤醒在该对象上等待的所有线程。


    二. Object类的常用方法

    方法名称类型描述
    toString( )普通取得对象信息
    equals()普通对象内容比较

    toString方法

    toString():取得对象信息,返回该对象的字符串表示

    我们先看一个简单的例子:
    在这里插入图片描述

    输出:iqqcode.algorithm.bintree.Person@1ee12a7

    在使用对象直接输出的时候,默认输出的是一个对象在堆内存上的地址值;如若要输出该对象的内容,则要覆写toString()方法

    覆写Person中的toString()方法
    在这里插入图片描述

    名字为:Mr.Q 年龄为:20

    toString( )的核心目的在于取得对象信息

    String作为信息输出的重要数据类型,在Java中所有的数据类型只要遇见String就执行了+,都要求其变为字符串后连接,而所有对象想要变为字符串就默认用toString( )方法

    例如:

    System.out.println("hello" + 123);
    
    >>> 输出:hello 123
    

    为什么hello 和 123 (一个是字符串,一个是int类型的数据) 就可以直接拼接在一起呢?

    因为字符串是爸爸,在这个拼爹的时代,他有一个万能的爸爸Object

    换而言之,Object是所有类的父类,任意类都是继承Object类的。而Object中定义了 toString()方法,所以任意类中都包含了toString()方法,对象在实例化之后都可以调用。

    所以任意对象转字符串的输出,是通过覆写 toString()方法实现的…

    每一个类中都包含有toString(),但是并不是每一个类都覆写了toString()
    在这里插入图片描述
    在这里插入图片描述
    在源码中,可以发现通过反射,获取到了当前对象的全限定类名和@十六进制哈希值字符串。这就是不覆写toString()时直接打印输出的内容。


    equals方法

    equals():对象比较

    String类对象比较 使用的是 equals()方法,实际上String类的equals()方法就是覆写 Object类中的equals()方法

    • 基本数据类型的比较用 == (如: a == 3,b == 4, a == b,比较的是值是否相等)
    • 引用类型数据比较:调用 equals()方法进行比较

    ​​用equals( )来比较对象内容是否相同:
    ​​在这里插入图片描述
    两个对象per1和per2的内容明明相等,应该是true呀?怎么会是false?

    因为此时直接调用equals()方法默认进行比较的是两个对象的地址。

    在源码中,传递来的Object对象和当前对象比较地址值,返回布尔值。
    在这里插入图片描述
    但是,new一下就会在堆上创建新空间,两个对象地址自然不会相同,所以为false。

    但是在判断两个对象是否相等时,比如要判断一个Person类的两个对象的姓名是否相同时,此时要重新覆写equals()

    还是上面的例子,覆写equals()方法
    在这里插入图片描述

    比较结果:true

    所以,引用类型的数据在进行比较时,应该先覆写equals()方法,不然比较的还是两个对象的堆内存地址值,必然不会相等.


    其他相关方法详解

    展开全文
  • Object类中的registerNatives方法的作用深入介绍

    万次阅读 多人点赞 2019-06-06 19:03:18
    一直以来,对Object类中的registerNatives()方法感到十分好奇,想知道它的作用到底是什么。但查阅了不少博客,目前还没找到全面彻底且浅显易懂地介绍该方法作用的博客。于是就有了写本文的想法。本文不会直接给出...
  • scala之object类

    千次阅读 2019-05-15 11:31:36
    目录 (1)object什么 ...继承抽象,重写抽象类中方法 3.object 定义 特殊的 apply 方法 4.object 实现 scala 的 main 方法 5.object 实现枚举值 (1)object什么 含义:相当于clas...
  • python的class()object什么意思?

    万次阅读 多人点赞 2019-06-04 16:02:48
    原文地址:... 那写object和不写object什么区别? 好的,再用代码来理解它们的区别. #-.-coding:utf-8-.- #__author__='zhengtong' classPerson: """ 不带object ...
  • 回答这些问题的时候,你要说明为什么把这些方法放在Object类里是有意义的,还有不把它放在Thread里的原因。一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要...
  • Object类中的五种方法

    万次阅读 2017-02-06 19:07:37
    基本数据类型不会继承Object类 clone()克隆一个对象的方法 1.先覆盖克隆方法 2.实现Cloneable接口 3.方法调用,抛出异常 ------------- public class ExecClone01{ //3.抛出异常 public static
  • Java中Object类之clone()方法详解

    千次阅读 2017-10-16 08:40:40
    一、clone()方法 clone意思是克隆、复制。...clone()方法在类Object中定义如下。 /** * Class Object is the root of the class hierarchy. Every class has Object as a superclass. * Al...
  • js中Object定义的几种方法

    千次阅读 2017-05-23 16:15:23
    var o1 = Object.create(null); var o2 = {}; var o3 = new Object(); console.log(o1); console.log(o2);...由此可见,Object.create(null)方法是继承自null的,没有__proto__。具体比较阮大叔写的很清楚了:htt
  • 很多同学有疑问,为什么python里的class定义类括号有object 当我python编辑器里输入object后,然后按住ctrl键+鼠标左键 即可查看object里的方法 class object: """ The most base type """ # del obj.xxx或...
  • Object类有哪些方法?各有什么作用?

    万次阅读 多人点赞 2018-08-21 10:27:52
    直接一点上图(使用的是JDK1.7的源码):Object类总共13个方法 ...主要是JAVA里除了8种基本类型传参数是值传递,其他的对象传参数都是引用传递,我们有时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法...
  • # -.- coding:utf-8 -.- # __author__ = 'zhengtong' class Person: """ 不带object """ name = "zhengtong" class Animal(object): """ 带有object """ name = "chonghong"if __name__
  • wait()、notify()和notifyAll()方法什么属于Object

    千次阅读 热门讨论 2019-01-27 15:59:37
    前提条件 要搞清这个问题,我们首先需要知道wait...原因一:Java,任何对象都可以作为锁,既然wait是放弃对象锁,当然就要把wait定义在这个对象所属的类中。更通用一些,由于所有都继承于Object,我们完全可以...
  • 有时候我们在定义数据结构的时候,不如List,HashMap等等,因为我们不知道提前装里面的是什么,所以我们可以先定义它为Object的数据类型,形如控制器的代码如下,那什么Object类,它有哪些方法,我们怎么去理解...
  • Object类的常用方法

    万次阅读 2018-06-20 18:37:49
    object类的结构 如图可知,Object类有12个成员方法,按照用途可以分为以下几 1,构造函数 2,hashCode和equale函数用来判断对象是否相同, 3,wait(),wait(long),wait(long,int),notify(),notifyAl...
  • python object是何类型

    千次阅读 2021-01-14 16:19:29
    python object是何类型发布时间:2020-08-26 10:23:01来源:亿速云阅读:58...Python的世界object是父子关系的顶端,所有的数据类型的父类都是它;type是类型实例关系的顶端,所有对象都是它的实例的。它们...
  • Object是所有的父类,任何都默认继承Object。 一、Object类中方法 ...主要是JAVA里除了8种基本类型传参数是值传递,其他的对象传参数都是引用传递,我们有时候不希望在方法里讲参数改变,这是就
  • Object类的equals()方法入门详解

    千次阅读 2018-04-26 14:17:52
    equals(Object o)定义:比较是否相等,Object中的equals()方法与==相同(如下源码),都是比较两个对象的内存地址。子类一般情况下需要重写equals方法。 public boolean equals(Object obj) { return (this == ...
  • 覆盖/重写Object类中equals方法

    千次阅读 2018-07-22 19:53:43
    我们写程序时,往往有时Java类库的equals方法不能满足我们的需求。这时,就需要我们自己来定义equals方法写自定义equals方法之前,我满先来看两个类库已经写好的equals方法。 一、Object.equals() 很...
  • java:Object类的hashCode方法

    千次阅读 2018-09-29 10:55:31
    默认情况下,该方法会根据对象的地址来计算。 2:不同对象的,hashCode()一般来说不会相同。但是,同一个对象的hashCode()值肯定相同。 下方代码: public class Demo1_HashCode { public static void main...
  • 【Java面试题】之Object类中方法详解

    千次阅读 2017-10-25 15:12:30
    之前看到有人分享的面经,面试官先问Object中什么方法,然后再要求解释每一次方法的作用。 先看看Object中什么方法 Object类是Java所有的基类。位于java.lang包中,一共有13个方法 方法Object() ...
  • 你可以使用Kotlin单例(使用object对象表达式而不是class)替换含有静态方法的Java每个方法上使用@JvmStatic注解 。如下例所示:这种情况下,生成的字节代码不再显示任何伴生对象,静态方法会附加到类中。 ...
  • java中Object转String

    千次阅读 2020-12-23 13:59:55
    Object转为String的几形式java项目的实际开发和应用,常常需要用到将对象转为String这一基本功能。本文将对常用的转换方法进行一个总结。常用的方法Object.toString(),(String)要转换的对象,String.value...
  • Object wait方法

    千次阅读 2017-02-04 14:54:22
    但是拿到锁的线程A执行的过程,因为某些条件还不满足,暂时不想继续执行下去,想先等待一下(注意:是已经拿到锁的线程A自己想主动等待的),希望等到某个条件满足后,继续执行任务。同步代码块里,线程A必须先...
  • Javaobject九大方法

    万次阅读 2018-09-12 16:44:21
    Java,只有基本类型(int,boolean等)的值不是对象。其他类型,包括数组类型,不管是对象数组还是基本类型的数组都扩展于Object类方法摘要 protected Object clone() 创建并返回此对象的一个副本。  ...
  • 1、编译源代码时,当遇到没有父类的时,编译器会将其指定一个默认的父类(一般为Object),而虚拟机处理到这个时,由于这个已经有一个默认的父类了,因此,VM仍然会按着常规的方法来处理每一个。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,913,557
精华内容 765,422
关键字:

object类存在的意义以及官方在object中定义了什么8种方法