精华内容
下载资源
问答
  • 为什么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 方法)。
    展开全文
  • 1) wait notify 不仅仅普通方法或同步工具,更重要的它们 Java 两个线程之间的通信机制。对语言设计者而言, 如果不能通过 Java 关键字(例如 synchronized)实现通信此机制,同时又要确保这个机制对每个...

    1) wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。对语言设计者而言, 如果不能通过 Java 关键字(例如 synchronized)实现通信此机制,同时又要确保这个机制对每个对象可用, 那么 Object 类则是的正确声明位置。记住同步和等待通知是两个不同的领域,不要把它们看成是相同的或相关的。同步是提供互斥并确保 Java 类的线程安全,而 wait 和 notify 是两个线程之间的通信机制。

    2) 每个对象都可上锁,这是在 Object 类而不是 Thread 类中声明 wait 和 notify 的另一个原因。

    3) 在 Java 中为了进入代码的临界区,线程需要锁定并等待锁定,他们不知道哪些线程持有锁,而只是知道锁被某个线程持有, 并且他们应该等待取得锁, 而不是去了解哪个线程在同步块内,并请求它们释放锁定。

    4) Java 是基于 Hoare 的监视器的思想。在Java中,所有对象都有一个监视器。线程在监视器上等待,为执行等待,我们需要2个参数:一个线程、一个监视器(任何对象)

    在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。但是,我们可以指定监视器(这是我们称之为等待的对象)。这是一个很好的设计,因为如果我们可以让任何其他线程在所需的监视器上等待,这将导致“入侵”,导致在设计并发程序时会遇到困难。请记住,在 Java 中,所有在另一个线程的执行中侵入的操作都被弃用了(例如 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类的方法
    
    展开全文
  • 回答这些问题的时候,你要说明为什么把这些方法放在Object类里有意义的,还有不把它放在Thread类里的原因。一个很明显的原因JAVA提供的锁对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要...

    这是个设计相关的问题,它考察的是面试者对现有系统和一些普遍存在但看起来不合理的事物的看法。回答这些问题的时候,你要说明为什么把这些方法放在Object类里是有意义的,还有不把它放在Thread类里的原因。一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

     

    展开全文
  • Java 里面, wait() notify() Object 的成员函数,基础的基础。为什么Java 要把 wait() notiry() 放在如此基础的类里面,而不作为 Thread 类的成员函数,或者其他类的函数呢? 回答这个问题之前...
  • 回答这些问题的时候,你要说明为什么把这些方法放在Object类里有意义的,还有不把它放在Thread类里的原因。一个很明显的原因JAVA提供的锁对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要...
  • 简单的说,由于wait,notify,notifyAll都锁级别的操作,所以把他们定义在object因为锁属于对象。 如果wait, notify notifyAll 这些方法在 thread 类里面会有什么问题? wait方法仍然可以使当前线程挂起,但...
  • 简单的说,由于waitnotify和notifyAll都锁级别的操作,所以把他们定义在Object,因为锁属于对象。
  • wait()、notify()notifyAll()方法为什么属于Object

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

    千次阅读 2018-04-13 10:12:22
    一、前言常见面试题:为什么wait和notify方法是Object的方法,而不是在Thread里,毕竟通常我们都是在多线程的时候在使用wait和notify方法。解释:1.首先我们知道生产者和消费者模型里,我们使用的是一个Object ...
  • 您可能已经注意到Object类具有三个最终方法,分别称为waitnotify和notifyAll。这些方法用于线程间...什么是waitnotify和notifyAll方法? waitnotify和notifyAll方法用于允许线程通过访问公共对象彼此通信,或
  • Condition JDK 1.5 提供的用来替代 wait notify 的线程通讯方法,那么一定会有人问:为什么不能用 wait notify 了? 哥们我用的好好的。老弟别着急,听我给你细说...之所以推荐使用 Condition 而非 ...
  • java wait 和notify

    2011-04-18 21:44:00
    首先声明,此篇文章摘自他人,但有些地方我做了点补充:要理解notify()和wait(),因为这两个方法不属于Thread 类,而是属于最底层的object基础类的,也就是说不光Thread,每个对象都有notify和wait的功能为什么?...
  • 1.wait和notify不仅仅普通方法或同步工具,更重要的它们Java两个线程之间的通信机制 。对语言设计者而言,如果不能通过Java关键字(例如synchronized)实现此通信机制,同时又要确保这个机...
  • 它们是在有 synchronized 标记的方法或 synchronized 块调用的,因为 wait nodify 需要监视对其调用的 Object。 大多数Java开发人员都知道对象类的 wait(),notify() notifyAll() 方法必须在 Java 的 ...
  • 1.wait()、notify()notifyAll()方法本地方法,并且final方法,无法被重写。 2.调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(锁)。 3.调用某个对象的notify()方法能够...
  • 为什么 wait/notify/notifyAll 被定义 Object,而 sleep 定义 Thread 类wait/notify sleep 方法的异同? 为什么 wait 必须 synchronized保护的同步代码使用? 首先,我们来看第一个问题,...
  • 一、sleep & wait 1. 两者来自不同的类(分别Thread和Object) 2.sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或方法...二、wait和notify为什么会封装在Object,而不是像sle...
  •   为什么wait()等方法是在Object中而不是Thread中呢?   同理,wait(),notify()是对等待这个Object(锁)的线程进行阻塞,唤醒等操作的,当然也要放在Object中   假设,wait(),notify()放在Thead中,那么Thread...
  •  为什么在前几天纪录线程的时候没有纪录这两个方法呢,因为这两个方法本来就不属于Thread类,而是属于最底层的object基础类的,也就是说不光Thread,每个对象都有notify和wait的功能,为什么?因为
  • wait()与notify()

    2019-09-29 19:54:20
    一,前言 ​ ​ 简单画了一下线程的流程图,...​ wait()和notify()都定义在Object为什么如此设计。因为synchronized的这把锁可以任意对象,所以任意对象都可以调用wait()和notify(),并且只有同一把...
  • 为什么这三个方法必须synchronized方法使用? 并且调用wait notify和notifyAll的对象必须锁对象。 可以看一下三个方法的源码实现。 http://blog.csdn.net/raintungli/article/details/6532784个人理解如果...
  • wait(),notify(),notifyAll() 这些方法为什么会定义在Object呢? 这些方法好像就属于线程的方法,但是Thread类并没有这些方法,多线程同步锁对象:任意的Java类这些方法都锁对象有关系,所以定义在Object类面试...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 121
精华内容 48
关键字:

为什么wait和notify是在object中