精华内容
下载资源
问答
  • 为什么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

    千次阅读 热门讨论 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类中。

    温馨提示

    • 如果您对本文有疑问,请在评论部分留言,我会在最短时间回复。
    • 如果本文帮助了您,也请评论,作为对我的一份鼓励。
    • 如果您感觉我写的有问题,也请批评指正,我会尽量修改。
    展开全文
  • 今天面试问到了这个问题,没有回答上来。网上找了yixi

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


    这两者的施加者是有本质区别的. 
    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不需要捕获异常

    展开全文
  • 点击上方“芋道源码”,选择“设星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 8:55 更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2020 超神之路,很肝~...

    点击上方“芋道源码”,选择“设为星标

    管她前浪,还是后浪?

    能浪的浪,才是好浪!

    每天 8:55 更新文章,每天掉亿点点头发...

    源码精品专栏

     

    来源:sf.gg/a/1190000019962661

    这是一个较难回答的Java面试题

    当年厮大面试美团,就跪在了这个问题

    Java语言又不是你设计的,

    如何回答这个问题呢?

    所以,需要对 Java 编程的常识进行深入了解才行。

    这个问题的好在它能反映面试者是否对 wait - notify 机制有没有了解, 以及他相关知识的理解是否明确。就像为什么 Java 中不支持多继承或者为什么 String 在 Java 中是 final 的问题一样,这个问题也可能有多个答案。

    为什么在 Object 类中定义 wait 和 notify 方法,每个人都能说出一些理由。从我的面试经验来看, wait 和 nofity 仍然是大多数Java 程序员最困惑的,特别是2到3年的开发人员,如果他们要求使用 wait 和 notify, 他们会很困惑。因此,如果你去参加 Java 面试,请确保对 wait 和 notify 机制有充分的了解,并且可以轻松地使用 wait 来编写代码,并通过“生产者-消费者”问题或实现阻塞队列等了解通知的机制。

    为什么等待和通知需要从同步块或方法中调用, 以及 Java 中的 wait,sleep 和 yield 方法之间的差异,如果你还没有读过相关知识,一定要看看。为何 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 的监视器的思想(http://en.wikipedia.org/wiki/...)。在Java中,所有对象都有一个监视器。

    线程在监视器上等待,为执行等待,我们需要2个参数:

    • 一个线程

    • 一个监视器(任何对象)

    在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。但是,我们可以指定监视器(这是我们称之为等待的对象)。这是一个很好的设计,因为如果我们可以让任何其他线程在所需的监视器上等待,这将导致“入侵”,影响线程执行顺序,导致在设计并发程序时会遇到困难。请记住,在 Java 中,所有在另一个线程的执行中造成入侵的操作都被弃用了(例如 Thread.stop 方法)。



    欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

    已在知识星球更新源码解析如下:

    最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

    提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

    获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

    兄弟,一口,点个????

    展开全文
  • 1、为什么必须和 synchronized 一起使用 Java 里面, wait() ...回答这个问题之前,我们先聊聊 为什么 wait() 和 notify() 必须和 synchronized 一起使用?看下面代码: public class SynchronizedDemo3 { p
  • 为什么 wait方法必须 synchronized保护的同步代码中使用? 为什么 wait/notify/notifyAll 被定义 Object 类中,而 sleep 定义 Thread 类中? wait/notify 和 sleep 方法的异同? 为什么 wait方法必须 ...
  • 为什么wait与notify设计在Object类中?

    千次阅读 2019-02-12 10:47:52
    因为synchronized关键词(设计的初衷可能是为了简化多线程程序的编写)可以加每个类的方法之上。 每个对象都有一个monitor(因此每个对象都潜在需要线程同步),虚拟机执行synchronized修饰的代码块时,需要...
  • 为什么wait,notify,notifyAll声明Object中而不是Thread中这个问题是一个非常有名的java核心面试题,各种级别的Java开发者面试中都会出现
  • LZ网上看了很多关于这个问题的解释,都不够深入,那么今天就让我带大家深入了解这个问题。关于synchronized的详细介绍请移步大神所写的博客:深入理解Java并发之... 说到Object的这三个方法,就需要先说一下sync...
  • 它们是在有 synchronized标记的...大多数Java开发人员都知道对象类的 wait(),notify() 和 notifyAll() 方法必须在 Java 中的 synchronized方法或 synchronized块中调用, 但是我们想过多少次, 为什么在 Java 中 wai...
  • 它们是有 synchronized 标记的方法或 synchronized 块中调用的,因为 wait 和 nodify 需要监视对其调用的 Object。 大多数Java开发人员都知道对象类的 wait(),notify() 和 notifyAll() 方法必须 Java 中的 ...
  • 1) wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。对语言设计者而言, 如果不能通过 Java 关键字(例如 synchronized)实现通信此机制,同时又要确保这个机制对每个...
  • 为什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread类中 因为java中每个对象都有一把称之为monitor监控器的锁 由于每个对象都可以上锁,这就要求在对象头中有一个用来保存锁信息的位置 这个锁是...
  • 回答这些问题的时候,你要说明为什么把这些方法放在Object类里是有意义的,还有不把它放在Thread类里的原因。一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要...
  • 首先,如果未持有对象锁的情况下调用object.wait()/notify(),直接会报错,JDK已经做好保护。 其次,为什么要这么设计?其实这是一种安全设计,为了防止wait错过notify。请看下面代码: boolean wakeuped = false...
  • 5.为什么wait(),notify(),notifyAll()等方法都是定义在Object类中 因为这些方法的调用是依赖锁对象,而同步代码块的锁对象是任意锁 而Object代码任意的对象,所以,定义在这里面。
  • 1.wait()、notify()和notifyAll()方法是本地方法,并且final方法,无法被重写。 2.调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(锁)。 3.调用某个对象的notify()方法能够...
  • 关于wait()、notify()的使用 public class WaitDemo { public static Object object = new Object(); public static void main(String[] args) throws InterruptedException { Thread1 thread1 = new Thread1()...
  • 一般基础点的都会问使用的方法,当然这只是初级的问题,那么稍微深点的问题,可能就像我们标题这样:为什么线程通信的方法wait()、notify()、notifyAll()被定义在Object类里面?而sleep定义在Thread类里面? 其实...
  • 最经典的生产者-消费者模型就可以基于wait-notify机制来实现的,那么编写代码的时候发现,JDK要求对object.wait()和object().notify方法必须synchronized代码块内部使用,否则运行时会抛出...那么为什么J...
  • 为什么在Object类而不是Thread类中声明wait()和notify()方法?9个解决方案42 votes因为,您等待给定的对象(或特定地,其监视器)使用此功能。我认为您可能会误解了这些方法的工作方式。 它们不只是处于线程粒度级别,...
  • 回答这些问题的时候,你要说明为什么把这些方法放在Object类里是有意义的,还有不把它放在Thread类里的原因。一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要...
  • 一个较难回答的 Java 问题, Java 编程语言又不是你设计的,你如何回答这个问题呢? 需要对 Java 编程的常识进行...为什么在 Object 类中定义 wait 和 notify 方法,每个人都能说出一些理由。 从我的面试经验来看, wait

空空如也

空空如也

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

wait方法为什么在object