-
为什么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 类中? 以下观点我认为是有道理的:- wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。
对语言设计者而言, 如果不能通过 Java 关键字(例如 synchronized)实现通信此机制,同时又要确保这个机制对每个对象可用, 那么 Object 类则是的合理的声明位置。
记住同步和等待通知是两个不同的领域,不要把它们看成是相同的或相关的。同步是提供互斥并确保 Java 类的线程安全,而 wait 和 notify 是两个线程之间的通信机制。 - 每个对象都可上锁,这是在 Object 类而不是 Thread 类中声明 wait 和 notify 的另一个原因。
- 在 Java 中,为了进入代码的临界区,线程需要锁定并等待锁,他们不知道哪些线程持有锁,而只是知道锁被某个线程持有, 并且需要等待以取得锁, 而不是去了解哪个线程在同步块内,并请求它们释放锁。
- Java 是基于 Hoare 的监视器的思想:在Java中,所有对象都有一个监视器。线程在监视器上等待,为执行等待,我们需要2个参数:
一个线程
一个监视器(任何对象)
在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。但是,我们可以指定监视器(这是我们称之为等待的对象)。
这是一个很好的设计,因为如果我们可以让任何其他线程在所需的监视器上等待,这将导致“入侵”,影响线程执行顺序,导致在设计并发程序时会遇到困难。
请记住,在 Java 中,所有在另一个线程的执行中造成入侵的操作都被弃用了(例如 Thread.stop 方法)。
- wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。
-
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方法在object类中,sleep方法在Thread类中?
2014-07-04 17:42:18今天面试问到了这个问题,没有回答上来。在网上找了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不需要捕获异常 -
面试题:为什么 wait 方法定义在 Object 类里面,而不是 Thread 类?
2020-07-18 10:45:00点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 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 类中? 以下观点我认为是有道理的:
wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。对语言设计者而言, 如果不能通过 Java 关键字(例如 synchronized)实现通信此机制,同时又要确保这个机制对每个对象可用, 那么 Object 类则是的合理的声明位置。记住同步和等待通知是两个不同的领域,不要把它们看成是相同的或相关的。同步是提供互斥并确保 Java 类的线程安全,而 wait 和 notify 是两个线程之间的通信机制。
每个对象都可上锁,这是在 Object 类而不是 Thread 类中声明 wait 和 notify 的另一个原因。
在 Java 中,为了进入代码的临界区,线程需要锁定并等待锁,他们不知道哪些线程持有锁,而只是知道锁被某个线程持有, 并且需要等待以取得锁, 而不是去了解哪个线程在同步块内,并请求它们释放锁。
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 领取,更多内容陆续奉上。
兄弟,艿一口,点个赞!????
-
并发编程— wait 与 notify 为什么是 Object 的成员方法?
2020-12-10 19:07:531、为什么必须和 synchronized 一起使用 在 Java 里面, wait() ...在回答这个问题之前,我们先聊聊 为什么 wait() 和 notify() 必须和 synchronized 一起使用?看下面代码: public class SynchronizedDemo3 { p -
为什么 wait 方法必须在 synchronized 保护的同步代码中使用? 为什么 wait/notify/notifyAll 被定义在 ...
2020-07-03 20:42:33为什么 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类中
2019-12-08 17:57:45为什么wait,notify,notifyAll声明在类Object中而不是在Thread中这个问题是一个非常有名的java核心面试题,在各种级别的Java开发者面试中都会出现 -
深入理解wait()、notify()和notifyAll()方法为什么属于Object,为什么要在synchronized代码块中
2020-01-08 16:18:33LZ在网上看了很多关于这个问题的解释,都不够深入,那么今天就让我带大家深入了解这个问题。关于synchronized的详细介绍请移步大神所写的博客:深入理解Java并发之... 说到Object的这三个方法,就需要先说一下sync... -
java synchronized 循环里 wait_为什么 wait 方法要在 synchronized 中调用?
2021-03-13 14:20:14它们是在有 synchronized标记的...大多数Java开发人员都知道对象类的 wait(),notify() 和 notifyAll() 方法必须在 Java 中的 synchronized方法或 synchronized块中调用, 但是我们想过多少次, 为什么在 Java 中 wai... -
为什么 wait 方法要在 synchronized 中调用?
2020-07-13 09:09:50它们是在有 synchronized 标记的方法或 synchronized 块中调用的,因为 wait 和 nodify 需要监视对其调用的 Object。 大多数Java开发人员都知道对象类的 wait(),notify() 和 notifyAll() 方法必须在 Java 中的 ... -
为什么wait 和 notify 在 Object 类而不在 Thread 中声明?
2019-11-14 09:36:331) wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。对语言设计者而言, 如果不能通过 Java 关键字(例如 synchronized)实现通信此机制,同时又要确保这个机制对每个... -
为什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread类中,wait/notify和sleep方法的异同
2020-07-14 17:14:23为什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread类中 因为java中每个对象都有一把称之为monitor监控器的锁 由于每个对象都可以上锁,这就要求在对象头中有一个用来保存锁信息的位置 这个锁是... -
为什么wait,notify,notifyAll定义在Object中?
2019-11-04 14:08:13回答这些问题的时候,你要说明为什么把这些方法放在Object类里是有意义的,还有不把它放在Thread类里的原因。一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要... -
为什么在Java中object.wait()/notify()方法必须在持有锁的情况下才能执行?
2019-07-11 21:30:52首先,如果在未持有对象锁的情况下调用object.wait()/notify(),直接会报错,JDK已经做好保护。 其次,为什么要这么设计?其实这是一种安全设计,为了防止wait错过notify。请看下面代码: boolean wakeuped = false... -
多线程面试题之为什么wait(),notify(),notifyAll()等方法都是定义在Object类中
2020-10-09 21:22:405.为什么wait(),notify(),notifyAll()等方法都是定义在Object类中 因为这些方法的调用是依赖锁对象,而同步代码块的锁对象是任意锁 而Object代码任意的对象,所以,定义在这里面。 -
wait()、nofify()和notifyAll()为什么是Object类中的方法
2019-07-12 09:23:291.wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。 2.调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(锁)。 3.调用某个对象的notify()方法能够... -
为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object类里
2020-07-28 00:14:36关于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...
2020-03-18 18:40:43一般基础点的都会问使用的方法,当然这只是初级的问题,那么稍微深点的问题,可能就像我们标题这样:为什么线程通信的方法wait()、notify()、notifyAll()被定义在Object类里面?而sleep定义在Thread类里面? 其实... -
为什么object.wait()、object.notify()一定要放在synchronized代码块内?
2019-12-22 20:29:19最经典的生产者-消费者模型就可以基于wait-notify机制来实现的,那么在编写代码的时候发现,JDK要求对object.wait()和object().notify方法必须在synchronized代码块内部使用,否则运行时会抛出...那么为什么J... -
java wait在哪个类_多线程-为什么在Java的Object类中声明wait()和notify()?
2021-02-28 10:52:09为什么在Object类而不是Thread类中声明wait()和notify()方法?9个解决方案42 votes因为,您等待给定的对象(或特定地,其监视器)使用此功能。我认为您可能会误解了这些方法的工作方式。 它们不只是处于线程粒度级别,... -
一、基础篇--1.1Java基础-Object类中常见的方法,为什么wait notify会放在Object里边...
2019-09-27 00:13:41回答这些问题的时候,你要说明为什么把这些方法放在Object类里是有意义的,还有不把它放在Thread类里的原因。一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要... -
为什么 wait,notify 和 notifyAll 是在 Object 类中定义的而不是在 Thread 类中定义?
2021-03-28 13:41:29一个较难回答的 Java 问题, Java 编程语言又不是你设计的,你如何回答这个问题呢? 需要对 Java 编程的常识进行...为什么在 Object 类中定义 wait 和 notify 方法,每个人都能说出一些理由。 从我的面试经验来看, wait