-
为什么在Java中object.wait()/notify()方法必须在持有锁的情况下才能执行?0
为什么必须只有锁?我说的是为什么这么设计,不是说这样用的话就会抛异常。。2013年3月11日 14:29
3个答案 按时间排序 按投票排序
-
采纳的答案
只有两个线程抢一个资源的时候才存在两个线程同一时刻只能有一个线程得到资源,锁就是为了使两个线程抢同一个资源,如果没有锁,意思是两个线程不存在抢资源情况,那两个线程凭什么你等我 我等你,早就一起跑了。
2013年3月11日 21:30
-
补充一下,wait逻辑通常是两步操作: (1)先判断特定的条件是否满足,如果不满足,(2)则进入wait。如果没有同步保护,就可能设置条件+唤醒的操作插入在这两步操作中间执行(1和2中间),造成wait线程即错过满足的条件,又因为notify先于wait执行而不会被唤醒。
2013年4月07日 21:20
-
wait 必需持有锁是一种安全设计,为了防止wait错过notify.请看下面代码。
boolean wakeuped = false; void dowait() { if(wakeuped) return; wait(); } void wakeup() { wakeuped = true; notify(); }
如果一个线程 执行dowait,另一个线程执行wakeup,在没有同步保护的情况下可能存在着这样的执行循序:[wait thread ] if(wakeuped) return;//wakeuped is false; [notify thread] wakeuped=true;// wakeuped is true [notify thread] notify();//此时wait线程没有进入wait, [wait thread ] wait();//wakuped is true,此时进入wait,而notify先于wait执行,此时wait将不会被唤醒。
在dowait和wakeup两个方法上加上同步锁保护,则可以保证不会出现上面的执行顺序。wakeup要么先于dowait执行,要么在dowait线程进入wait后才能执行。
2013年4月07日 21:08
相关推荐
在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...
在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
很多人会疑惑为什么必须持有这个对象的锁才能调用对象的wait()和notify()方法呢?其实这是因为wait()和notify()方法需要在synchronized块中使用,以确保线程安全。 在使用wait()和notify()方法时,需要注意以下几点...
在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...
在Java编程语言中,`wait()`和`notify()`是Object类中的两个关键方法,它们用于线程间的协作和通信。这两个方法在多线程环境下尤其重要,因为它们允许线程等待特定条件并通知其他线程继续执行。在分析给定的程序之前...
- 当synchronized修饰普通方法时,意味着线程需要获取到该对象的锁才能执行方法。 - 对于静态方法,线程需要获取到类的类锁才能执行。 - synchronized修饰代码块时,线程需要获取指定对象的锁来执行代码块,这...
在Java多线程编程中,`Thread.sleep()` 和 `Object.wait()` 是两个非常重要的方法,它们分别位于 `Thread` 类和 `Object` 类中,用于控制线程的行为。本文将深入探讨这两个方法的区别以及它们在实际开发中的应用场景...
在调用wait()之前,线程必须已经获取了对象的锁,即wait()、notify()和notifyAll()都必须在`synchronized`代码块或方法中。 2. **notify()**: notify()方法用于唤醒一个正在等待同一对象监视器锁的线程。如果有多...
这些方法必须在`synchronized`代码块或方法中调用,因为它们需要在持有对象锁的情况下执行,否则会抛出`java.lang.IllegalMonitorStateException`异常。 1. `wait()`:调用此方法的线程会释放它持有的对象锁,进入...
通过本示例代码的学习,我们可以深入了解`wait()`与`notify()`方法的工作原理及其在Java多线程编程中的应用。这两个方法通过释放和重新获取锁的方式,有效地实现了线程间的通信和同步,是Java并发控制的重要组成部分...
总结来说,`wait`、`notify`和`notifyAll`是Java多线程中实现线程间通信的关键工具,它们允许线程在适当的时候释放资源并等待,以便其他线程完成特定任务后再继续执行。熟练掌握这些方法的使用,能够帮助你编写出...
这种方式下,整个方法体被视为一个临界区,线程必须获取到对象的监视器锁才能执行。 2. **同步代码块**: 对于更细粒度的控制,可以使用同步代码块,只锁定必要的代码区域: ```java synchronized (object) { ...
这是因为`wait()`方法需要在持有对象锁的情况下才能调用,以确保线程安全。 2. **使用if块还是循环**:这是一个关键问题,通常建议在循环中使用`wait()`,因为`wait()`会使线程进入等待状态,并且可能由于其他线程...
在Java编程语言中,`sleep()` 和 `wait()` 都是用来控制线程执行的重要方法,但它们的作用和使用场景有着显著的区别。以下是这两个方法的详细解释: 1. **`Thread.sleep(long milliseconds)`** - `sleep()` 方法是...
wait() 方法是 Object 类里的方法,当一个线程执行到 wait() 方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout) 超时时间到后还需要返还对象锁)。...
`wait()`方法主要用于实现线程的等待和唤醒机制,允许线程在特定条件下暂停执行并释放所持有的锁,从而让其他等待该锁的线程有机会获取并执行。 ### 等待和唤醒机制 在Java中,线程间的通信和同步主要依赖于`...
在Java中,`wait()`, `notify()`, `notifyAll()`方法是`Object`类的成员,而不是`Thread`类的,这意味着任何对象都可以作为等待和通知的基础。 **1. 状态变量(State Variable)** 状态变量是线程间通信的关键。当...
这个线程必须在 synchronized 代码块或方法中调用 `wait()`,因为这是获得对象锁的唯一方式。调用 `wait()` 后,线程会等待其他线程唤醒它。线程被唤醒有两种情况:一是其他线程调用了同一对象的 `notify()` 或 `...