0 0

什么是线程虚假唤醒3

JAVA文档上有提到线程虚假唤醒的概念,但是解释的不是明了

请问如何理解线程虚假唤醒?在什么情况下会发生?
2012年2月24日 00:26

6个答案 按时间排序 按投票排序

0 0

采纳的答案

给你找了一下资料,可以了解一下虚假唤醒的原因:
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.html

2012年2月24日 12:00
0 0

引用
这种实现是会出问题的,因为在轮询切换时,可能会漏掉notify的中断,从而无休止的休眠下去。



wait方法用这种方式是有问题,非wait的阻塞接口可以这样实现

2012年2月24日 16:31
0 0

楼上所说,这种实现是会出问题的,因为在轮询切换时,可能会漏掉notify的中断,从而无休止的休眠下去。

2012年2月24日 16:19
0 0

有一个情形就会,很多阻塞的api采用轮询的方式来监测是否有中断调用,在轮询过程中,线程从活动到休眠,又从休眠到活动,如此往复的检查中断,但是从整个api的角度来看,这个线程是处于休眠状态,但是用Thread相关方法判断,则可能会出现线程是alive的

如果采用操作系统调用才实现限时、可中断的api则不会有这样的问题

2012年2月24日 12:41
0 0

A thread  wake up
without being notified, interrupted, or timing out, is so-called spurious wakeup

2012年2月24日 10:44
0 0

虚假唤醒就是一些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

相关推荐

    【小家java】JUC并发编程之:虚假唤醒以及推荐的解决方案.docx

    虚假唤醒指的是,在没有其他线程调用`notify()`或者`notifyAll()`的情况下,处于等待状态的线程意外地被唤醒。 根据题目中给出的信息,我们可以得知,虚假唤醒现象虽然在实践中较少见,但是一旦发生,可能会导致...

    多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论

    然而,即使没有其他线程唤醒,线程也有可能会因为操作系统调度等原因意外地从等待状态中醒来,这就是所谓的虚假唤醒。 虚假唤醒并不是条件变量设计的缺陷,而是其设计的一部分。在标准中,线程库并不保证`wait()`...

    为什么在pthread_cond_wait()前要加一个while循环来判断条件是否为假呢?.Linux 多线程

    1. **虚假唤醒**:在多线程环境中,`pthread_cond_wait()`可能会在没有被信号(signal)唤醒的情况下返回,即条件未满足时线程被随机地唤醒,这种情况称为虚假唤醒。虽然这种现象在实践中较为罕见,但为了程序的健壮...

    彻底明白Java的多线程-线程间的通信.doc

    首先,我们要理解一个虚假的多线程示例。在例1中,创建了两个`TestThread`对象,分别调用`go(0)`和`go(1)`方法。尽管每个方法都在无限循环中调用了`Thread.sleep(100)`,但预期的线程切换并未发生。这是因为`sleep()...

    多线程互斥锁和条件变量demo

    3. 重新检查条件:被唤醒的线程A在继续执行前,应再次检查条件是否满足,防止因其他线程快速改变条件而产生的虚假唤醒问题。 在实际的多线程编程中,互斥锁和条件变量的组合使用可以解决复杂的同步问题,例如生产者...

    传智播客_张孝祥_传统线程同步通信技术

    它们常与互斥量一起使用,以避免虚假唤醒。 5. **死锁**:当两个或更多线程相互等待对方释放资源时,系统可能会进入死锁状态。避免死锁的关键策略包括资源预分配、避免环路等待、超时和死锁检测及恢复。 6. **线程...

    Java wait和notify虚假唤醒原理

    虚假唤醒(Spurious Wakeup)是指线程在没有被`notify()`或`notifyAll()`的情况下从`wait()`状态中醒来。这是Java并发编程中一个重要的概念,因为根据JVM规范,`wait()`可能会发生虚假唤醒,尽管这在实际应用中很少...

    ConditionVariablesJAVA多线程[定义].pdf

    在实现条件变量时,必须要注意线程在被唤醒后需要检查等待条件是否真的成立,因为在多线程环境下,可能会有虚假唤醒(spurious wakeups)的情况发生。虚假唤醒是指线程在没有其他线程发出唤醒信号的情况下被唤醒。...

    Java面试题线程部分.docx

    `wait`和`notify`是Object类的方法,用于线程间的等待和唤醒,它们必须在同步上下文中调用,以避免虚假唤醒。`yield`方法使当前线程让出执行权,但并不保证它不会立即重新获取执行权。 在Web开发中,Servlet、...

    java多线程系列(三)等待通知机制.docx

    6. **避免虚假唤醒**: 虽然Java规范保证了`wait()`在接收到`notify()`或`notifyAll()`后会醒来,但仍然可能存在虚假唤醒的情况。因此,通常需要在`wait()`之后添加一个循环检查条件,确保线程在适当的状态下恢复执行...

    java中线程同步方法

    调用wait方法时,必须在`synchronized`代码块内进行,且通常在while循环中调用以避免虚假唤醒的问题。 2. **notify方法和notifyAll方法**:这两个方法用于唤醒等待在锁上的线程。`notify`随机唤醒一个等待线程,而`...

    Java并发编程之美(这个写的不错)1

    线程的虚假唤醒是指在等待某个条件的满足时,线程被唤醒,但是并没有真正地满足条件。这种情况可以通过使用while循环来避免。 线程中断 线程中断是指线程被中断的状态。线程被中断后,线程会自行终止。中断一个...

    Java多线程文章系列.pdf

    - **虚假的多线程**: - 表面上看起来像多线程,但实际上并没有实现真正的并行处理。 - **正确的多线程实现**: - 使用`Thread`类或`Runnable`接口正确创建和启动线程。 ##### 2. 共享资源的同步 - **同步的必要性*...

    Java线程同步例子.pdf

    4. **条件变量**:在`Market`类中,通过while循环和条件判断来确保线程在合适的时候执行wait和notify操作,防止虚假唤醒。 5. **线程安全的数据结构**:`LinkedList`在多线程环境中是线程不安全的,但由于`set()`和...

    主线程去控制子线程wait与notify

    condition) wait()`来避免“虚假唤醒”问题,即使在没有被唤醒的情况下,线程也会再次检查条件。 在名为`MyTest`的代码文件中,我们可以找到具体的实现示例。这个文件很可能是包含了测试代码,用来演示如何通过主线...

    JAVA多线程同步机制及其应用.doc

    然而,单纯的`synchronized`并不能解决所有问题,如虚假同步(即同步的粒度过大,导致不必要的等待)和死锁(两个或更多线程相互等待对方释放资源,形成僵局)。为了解决这些问题,Java提供了`wait()`和`notify()`...

    B站河北王校长-并发编程-深度核心面试知识汇总.pdf

    * 在一个线程没有被其他线程调用notify()、notifyAll()方法进行通知,或者被中断,或者等待超时,这个线程仍然可以从挂起状态变为可以运行状态(也就是被唤醒),这就是所谓的虚假唤醒。 * 防止虚假唤醒的方法是在一...

    java多线程设计wait.docx

    4. **使用`while`循环进行条件检查**:为了避免虚假唤醒的问题,应该使用`while`循环而非`if`语句来检查等待条件是否成立。 #### 五、线程的状态 Java线程有多种状态,包括: - **新建状态**:线程已被创建但尚未...

    尚硅谷Java视频_JUC 视频教程

    尚硅谷_JUC线程高级_生产者消费者案例-虚假唤醒 ·9. 尚硅谷_JUC线程高级_Condition 线程通信 ·10. 尚硅谷_JUC线程高级_线程按序交替 ·11. 尚硅谷_JUC线程高级_ReadWriteLock 读写锁 ·12. 尚硅谷_JUC线程高级_...

Global site tag (gtag.js) - Google Analytics