6个答案 按时间排序 按投票排序
-
采纳的答案
给你找了一下资料,可以了解一下虚假唤醒的原因:
http://blog.csdn.net/nhn_devlab/article/details/6117239
http://en.wikipedia.org/wiki/Spurious_wakeup
http://www.cnblogs.com/leaven/archive/2010/06/03/1750973.html2012年2月24日 12:00
-
引用这种实现是会出问题的,因为在轮询切换时,可能会漏掉notify的中断,从而无休止的休眠下去。
wait方法用这种方式是有问题,非wait的阻塞接口可以这样实现2012年2月24日 16:31
-
有一个情形就会,很多阻塞的api采用轮询的方式来监测是否有中断调用,在轮询过程中,线程从活动到休眠,又从休眠到活动,如此往复的检查中断,但是从整个api的角度来看,这个线程是处于休眠状态,但是用Thread相关方法判断,则可能会出现线程是alive的
如果采用操作系统调用才实现限时、可中断的api则不会有这样的问题2012年2月24日 12:41
-
A thread wake up
without being notified, interrupted, or timing out, is so-called spurious wakeup2012年2月24日 10:44
-
虚假唤醒就是一些obj.wait()会在除了obj.notify()和obj.notifyAll()的其他情况被唤醒,而此时是不应该返回的,所以要加条件判断。如下是一个很好的代码实践:
synchronized (obj) { while (<condition does not hold>) obj.wait(); ... // Perform action appropriate to condition }
2012年2月24日 10:42
相关推荐
虚假唤醒指的是,在没有其他线程调用`notify()`或者`notifyAll()`的情况下,处于等待状态的线程意外地被唤醒。 根据题目中给出的信息,我们可以得知,虚假唤醒现象虽然在实践中较少见,但是一旦发生,可能会导致...
然而,即使没有其他线程唤醒,线程也有可能会因为操作系统调度等原因意外地从等待状态中醒来,这就是所谓的虚假唤醒。 虚假唤醒并不是条件变量设计的缺陷,而是其设计的一部分。在标准中,线程库并不保证`wait()`...
1. **虚假唤醒**:在多线程环境中,`pthread_cond_wait()`可能会在没有被信号(signal)唤醒的情况下返回,即条件未满足时线程被随机地唤醒,这种情况称为虚假唤醒。虽然这种现象在实践中较为罕见,但为了程序的健壮...
首先,我们要理解一个虚假的多线程示例。在例1中,创建了两个`TestThread`对象,分别调用`go(0)`和`go(1)`方法。尽管每个方法都在无限循环中调用了`Thread.sleep(100)`,但预期的线程切换并未发生。这是因为`sleep()...
3. 重新检查条件:被唤醒的线程A在继续执行前,应再次检查条件是否满足,防止因其他线程快速改变条件而产生的虚假唤醒问题。 在实际的多线程编程中,互斥锁和条件变量的组合使用可以解决复杂的同步问题,例如生产者...
它们常与互斥量一起使用,以避免虚假唤醒。 5. **死锁**:当两个或更多线程相互等待对方释放资源时,系统可能会进入死锁状态。避免死锁的关键策略包括资源预分配、避免环路等待、超时和死锁检测及恢复。 6. **线程...
虚假唤醒(Spurious Wakeup)是指线程在没有被`notify()`或`notifyAll()`的情况下从`wait()`状态中醒来。这是Java并发编程中一个重要的概念,因为根据JVM规范,`wait()`可能会发生虚假唤醒,尽管这在实际应用中很少...
在实现条件变量时,必须要注意线程在被唤醒后需要检查等待条件是否真的成立,因为在多线程环境下,可能会有虚假唤醒(spurious wakeups)的情况发生。虚假唤醒是指线程在没有其他线程发出唤醒信号的情况下被唤醒。...
`wait`和`notify`是Object类的方法,用于线程间的等待和唤醒,它们必须在同步上下文中调用,以避免虚假唤醒。`yield`方法使当前线程让出执行权,但并不保证它不会立即重新获取执行权。 在Web开发中,Servlet、...
6. **避免虚假唤醒**: 虽然Java规范保证了`wait()`在接收到`notify()`或`notifyAll()`后会醒来,但仍然可能存在虚假唤醒的情况。因此,通常需要在`wait()`之后添加一个循环检查条件,确保线程在适当的状态下恢复执行...
调用wait方法时,必须在`synchronized`代码块内进行,且通常在while循环中调用以避免虚假唤醒的问题。 2. **notify方法和notifyAll方法**:这两个方法用于唤醒等待在锁上的线程。`notify`随机唤醒一个等待线程,而`...
线程的虚假唤醒是指在等待某个条件的满足时,线程被唤醒,但是并没有真正地满足条件。这种情况可以通过使用while循环来避免。 线程中断 线程中断是指线程被中断的状态。线程被中断后,线程会自行终止。中断一个...
- **虚假的多线程**: - 表面上看起来像多线程,但实际上并没有实现真正的并行处理。 - **正确的多线程实现**: - 使用`Thread`类或`Runnable`接口正确创建和启动线程。 ##### 2. 共享资源的同步 - **同步的必要性*...
4. **条件变量**:在`Market`类中,通过while循环和条件判断来确保线程在合适的时候执行wait和notify操作,防止虚假唤醒。 5. **线程安全的数据结构**:`LinkedList`在多线程环境中是线程不安全的,但由于`set()`和...
condition) wait()`来避免“虚假唤醒”问题,即使在没有被唤醒的情况下,线程也会再次检查条件。 在名为`MyTest`的代码文件中,我们可以找到具体的实现示例。这个文件很可能是包含了测试代码,用来演示如何通过主线...
然而,单纯的`synchronized`并不能解决所有问题,如虚假同步(即同步的粒度过大,导致不必要的等待)和死锁(两个或更多线程相互等待对方释放资源,形成僵局)。为了解决这些问题,Java提供了`wait()`和`notify()`...
* 在一个线程没有被其他线程调用notify()、notifyAll()方法进行通知,或者被中断,或者等待超时,这个线程仍然可以从挂起状态变为可以运行状态(也就是被唤醒),这就是所谓的虚假唤醒。 * 防止虚假唤醒的方法是在一...
4. **使用`while`循环进行条件检查**:为了避免虚假唤醒的问题,应该使用`while`循环而非`if`语句来检查等待条件是否成立。 #### 五、线程的状态 Java线程有多种状态,包括: - **新建状态**:线程已被创建但尚未...
尚硅谷_JUC线程高级_生产者消费者案例-虚假唤醒 ·9. 尚硅谷_JUC线程高级_Condition 线程通信 ·10. 尚硅谷_JUC线程高级_线程按序交替 ·11. 尚硅谷_JUC线程高级_ReadWriteLock 读写锁 ·12. 尚硅谷_JUC线程高级_...