精华内容
下载资源
问答
  • wait()、notify()和notifyAll()方法为什么属于Object

    千次阅读 热门讨论 2019-01-27 15:59:37
    要搞清这个问题,我们首先需要知道wait()、notify()和notifyAll()是干吗的,然后才能够知道它们为什么属于Object。就以wait为例吧,wait的含义是使当前线程放弃对象锁,并进入阻塞状态。 原因 原因一:Java中,...

    前提条件

    要搞清这个问题,我们首先需要知道wait()、notify()和notifyAll()是干吗的,然后才能够知道它们为什么属于Object。就以wait为例吧,wait的含义是使当前线程放弃对象锁,并进入阻塞状态。

    原因

    • 原因一:Java中,任何对象都可以作为锁,既然wait是放弃对象锁,当然就要把wait定义在这个对象所属的类中。更通用一些,由于所有类都继承于Object,我们完全可以把wait方法定义在Object类中,这样,当我们定义一个新类,并需要以它的一个对象作为锁时,不需要我们再重新定义wait方法的实现,而是直接调用父类的wait(也就是Object的wait),此处,用到了Java的继承。
    • 原因二:有的人会说,既然是线程放弃对象锁,那也可以把wait定义在Thread类里面啊,新定义的线程继承于Thread类,也不需要重新定义wait方法的实现。然而,这样做有一个非常大的问题,一个线程完全可以持有很多锁,你一个线程放弃锁的时候,到底要放弃哪个锁?当然了,这种设计并不是不能实现,只是管理起来更加复杂。

    综上所述,wait()、notify()和notifyAll()方法要定义在Object类中。

    温馨提示

    • 如果您对本文有疑问,请在评论部分留言,我会在最短时间回复。
    • 如果本文帮助了您,也请评论,作为对我的一份鼓励。
    • 如果您感觉我写的有问题,也请批评指正,我会尽量修改。
    展开全文
  • 为什么Wait和notify方法Object中?

    千次阅读 2020-11-27 09:05:28
    ** 为什么Wait和notify方法Object类中** 为何 wait,notify 和 notifyAll 属于 Object 类? 为什么它们不应该在 Thread 类中? 以下观点我认为是有道理的: wait 和 notify 不仅仅是普通方法或同步工具,更重要的是...

    为什么Wait和notify方法在Object类中
    为何 wait,notify 和 notifyAll 属于 Object 类? 为什么它们不应该在 Thread 类中? 以下观点我认为是有道理的:

    1. wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。
      对语言设计者而言, 如果不能通过 Java 关键字(例如 synchronized)实现通信此机制,同时又要确保这个机制对每个对象可用, 那么 Object 类则是的合理的声明位置。
      记住同步和等待通知是两个不同的领域,不要把它们看成是相同的或相关的。同步是提供互斥并确保 Java 类的线程安全,而 wait 和 notify 是两个线程之间的通信机制。
    2. 每个对象都可上锁,这是在 Object 类而不是 Thread 类中声明 wait 和 notify 的另一个原因。
    3. 在 Java 中,为了进入代码的临界区,线程需要锁定并等待锁,他们不知道哪些线程持有锁,而只是知道锁被某个线程持有, 并且需要等待以取得锁, 而不是去了解哪个线程在同步块内,并请求它们释放锁。
    4. Java 是基于 Hoare 的监视器的思想:在Java中,所有对象都有一个监视器。线程在监视器上等待,为执行等待,我们需要2个参数:
      一个线程
      一个监视器(任何对象)
      在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。但是,我们可以指定监视器(这是我们称之为等待的对象)。
      这是一个很好的设计,因为如果我们可以让任何其他线程在所需的监视器上等待,这将导致“入侵”,影响线程执行顺序,导致在设计并发程序时会遇到困难。
      请记住,在 Java 中,所有在另一个线程的执行中造成入侵的操作都被弃用了(例如 Thread.stop 方法)。
    展开全文
  • 为什么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类的方法
    
    展开全文
  • 2、sleep方法属于Thread类,而wait方法属于Object类。 3、sleep方法不需要在synchronized中调用。但是wait方法需要在synchronized中调用。 4、如果方法的时间到期或被其他线程中断,会调用slee...

    1、sleep和wait方法的要点是sleep方法保持对象锁,直到它被中断或其时间到期。但是,wait方法释放对调用它的对象锁,并为其他对象提供运行的机会。

    2、sleep方法属于Thread类,而wait方法属于Object类。

    3、sleep方法不需要在synchronized中调用。但是wait方法需要在synchronized中调用。

    4、如果方法的时间到期或被其他线程中断,会调用sleep方法。当调用notify或notifyAll方法的时候会调用wait方法。

    5、sleep方法是静态方法,而wait方法不是静态方法。

    6、sleep方法在当前线程上执行,而wait方法在调用它的对象上执行。

    7、sleep方法抛出的异常是InterruptedException,而wait方法抛出的异常是IllegalArgumentException,IllegalMonitorStateException,InterruptedException。

    展开全文
  • 一篇说到了suspend()和resume()方法,这一篇咋们继续,接着来介绍wait()和notify()方法,我们都知道这两个方法和之前介绍的方法不太一样,那就是这两个方法是对象Object上的,不属于Thread上的。我们也知道这两个...
  • sleep方法属于Thread中方法,调用sleep 不会释放对象锁。waitObject 的方法,对此对象调用wait 方法导致本线程放弃对象锁,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。 转载于:...
  • 上一篇说到了suspend()和resume()方法,这一篇咋们继续,接着来介绍wait()和notify()方法,我们都知道这两个方法和之前介绍的方法不太一样,那就是这两个方法是对象Object上的,不属于Thread上的。我们也知道这两...
  • 对于sleep方法,该方法属于Thread类,而wait方法属于Object类。 sleep方法导致了程序暂停执行指定的时间,但会保持监控状态,线程不会释放对象锁。   当调用wait方法的时候,线程会释放对象锁,只有执行notify...
  • sleep方法属于Thread类,而wait方法属于object类。 sleep让当前线程睡眠一段时间,之后线程能自动恢复运行。wait则是让线程进入阻塞状态,之后该线程无法自动恢复运行,需通过notify()方法唤醒。 执行sleep时,...
  • 这些方法好像就属于线程的方法,但是Thread类中并没有这些方法,多线程中同步锁对象:任意的Java类这些方法都和锁对象有关系,所以定义在Object类面试题: 你使用过单例模式吗?简单介绍一种单例模式,请用代码设计面试官...
  • sleep和wait方法的区别

    2019-12-03 15:18:38
    wait()方法,则是属于Object类中的。 sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会...
  • wait方法属于Object类中的方法。 (2)方法调用上的不同 在方法的调用上,sleep是一个静态方法,通过类名调用。wait不是静态方法,通过对象来调用 (3)唤醒线程的方式不同 列如:在线程调用slee...
  • 首先要知道sleep是属于Thread的静态方法wait属于object成员方法。 来看一下源码里这两个方法签名: sleep public static native void sleep(long millis) throws InterruptedException; wait public final void ...
  • 上一篇说到了suspend()和resume()方法,这一篇咋们继续,接着来介绍wait()和notify()方法,我们都知道这两个方法和之前介绍的方法不太一样,那就是这两个方法是对象Object上的,不属于Thread上的。我们也知道这两...
  • sleep、wait、yield、join——简介 1 sleep sleep()方法是Thread的静态方法,是线程用来控制自身流程的。sleep 过程中线程不会释放锁...wait 方法属于Object ,用于线程间的通信。wait 过程中线程会释放对象锁,只
  • 一、Thread.sleep(long)与object....1.Thread.sleep(long)是属于Thread的静态方法。其基本语义是使当前运行的线程暂停一段时间。实现细节是把当前线程放入就绪线程队列中,直到睡眠时间到期才可被调度为执行线程(在
  • ①.`wait()`、`notify()`方法必须写在同步方法中,是为了防止死锁和永久等待,...两个方法所属不同,`sleep()`方法属于`Thread`;`wait()`属于`Object`中,放在`Object`中是因为`Java`中每个都可以是一把锁。
  • sleep()方法是属于Thread类中的,而wait()方法属于Object类中的方法。调用sleep()方法会暂停此线程指定的时间,让出cpu给其他线程,但是他的监控依然保持,不会释放同步资源锁,当指定的时间到了又会自动恢复运行...
  • 简单的说,由于wait,notify,notifyAll都是锁级别的操作,所以把他们定义在object类中因为锁属于对象。 如果wait, notify 和 notifyAll 这些方法在 thread 类里面会有什么问题? wait方法仍然可以使当前线程挂起,但...
  • sleep()方法wait()方法的有什么区别

    千次阅读 2020-08-24 11:22:25
    Sleep() Sleep方法属于Thread类...1.Wait()方法属于Object类,调用Wait方法时,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备,wait方法需要被动唤醒,
  • 一、Thread.sleep(long)与object.wait()/object.wait(long)的区别sleep(long)与wait()/wait(long)行为上有些类似,主要区别如下:1.Thread.sleep(long)是属于Thread的静态方法。其基本语义是使当前运行的线程暂停...
  • sleep(long)与wait()/wait(long)行为上有些类似,主要区别如下:1.Thread.sleep(long)是属于Thread的静态方法。其基本语义是使当前运行的线程暂停一段时间。实现细节是把当前线程放入就绪线程队列中,直到睡眠时间...
  • A.wait()方法属于Object类,sleep()属于Thread类 B.调用wait()方法的时候,线程会放弃对象锁 C.调用sleep()方法的过程中,线程不会释放对象锁 D.sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程 sleep...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 412
精华内容 164
关键字:

wait方法属于object类