什么是线程虚假唤醒

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

请问如何理解线程虚假唤醒?在什么情况下会发生?

0

6个回答

0

虚假唤醒就是一些obj.wait()会在除了obj.notify()和obj.notifyAll()的其他情况被唤醒,而此时是不应该返回的,所以要加条件判断。如下是一个很好的代码实践:
[code]
synchronized (obj) {
while ()
obj.wait();
... // Perform action appropriate to condition
}
[/code]

0

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

0

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

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

0

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

0

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

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

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
浅析多线程的虚假唤醒
       首先,关于if和while的使用,在单线程环境下是比较容易区分的,在此,不赘述。今天,主要聊聊在多线程环境下,if和while检测条件变量的区别。之前这个问题也一直困扰着我,明明是条件判断,第一反应就是if,可是为什么要用while呢?下面结合生产者消费者模型来简单分析下。nn     1.先使用if。我们先用只有一个生产者和一个消费者来看看结果如何。代码如下:nnn//生产者消费者...
java多线程基础总结【四】虚假唤醒
我们先来看一组例子package com.buerc.thread;nnpublic class TesProducerAndConsumer {n public static void main(String[] args) {n Clerk clerk=new Clerk();n n Producer producer=new Producer(clerk);n Consumer co...
关于多线程中的条件变量和虚假唤醒学习笔记
一、互斥量nn  互斥量又叫互斥锁,它是用来确保某一时刻一些数据(比如链表)只会被一个线程访问。nn有两种初始化的方式:nnpthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;nn或者nnpthread_mutex_t lock;nnpthread_mutex_init(&lock, NULL);nn然后就是使用,加锁和解锁:nn加锁需要使用p...
什么是Java虚假唤醒及如何避免虚假唤醒?《多线程学习之十四》
那什么是假唤醒?n当一个条件满足时,很多线程都被唤醒了,但是只有其中部分是有用的唤醒,其它的唤醒都是无用功n1.比如说买货,如果商品本来没有货物,突然进了一件商品,这是所有的线程都被唤醒了n ,但是只能一个人买,所以其他人都是假唤醒,获取不到对象的锁nn避免虚假唤醒n下面是避免虚假唤醒的示例:npackage duoxiancheng.bao;nn/*n * 虚假唤醒的解决:n * wait要始...
多线程虚假唤醒 的问题浮现及解决方案
测试代码:nnn/**n * 现在两个线程,可以操作初始值为零的一个变量,n * 实现一个线程对该变量加1,一个线程对该变量减1,交替,来10轮。n */npublic class ThreadTest {nn public static void main(String[] args) {nn Number num = new Number();n ...
条件变量的虚假唤醒(spurious wakeups)问题
条件变量的虚假唤醒(spurious wakeups)问题
Java多线程生产者消费者说明等待唤醒机制问题和虚假唤醒问题
不用等待唤醒机制实现的生产者与消费者代码package com.hust.juc;/*n * 生产者和消费者案例n */npublic class TestProductorAndConsumer { public static void main(String[] args) {n Clerk clerk = new Clerk(); Productor pro
条件变量之虚假唤醒
如有错误请及时指正!n文章目录条件变量之虚假唤醒引言1.什么是虚假唤醒?2.什么情况下会发生虚假唤醒3.如何避免虚假唤醒n条件变量之虚假唤醒n引言nn当我们使用互斥量(Mutex)与条件变量(condition_variable)进行多线程同步时有可能会产生虚假唤醒现象, 那么究竟什么是虚假唤醒,它会在什么情况下被触发,什么情况下无需考虑虚假唤醒,如何避免?nn1.什么是虚假唤醒?nLinux帮助...
java 线程 通知 虚假唤醒
1  synchronized 锁定的是当前对象的成员变量,也就是说无论当前对象有几个synchronized代码块,他们使用的是同意个锁,一个对象只有一个锁rn2 notifyAll 之后不会立马去唤醒而是等当前代码执行结束之后才回去唤醒rnclass Product{n n private int productQty = 0;n n public synchronized void incr
java,线程的等待唤醒机制,防止虚假唤醒,用LOCK替代,synchronized,wait,notify,notifyAll方法的实现;
 nn nn 1.先从一个题目说起:两个线程对一个初始值为0的变量擦欧洲哦,实现一个线程加,一个线程-, nn以下是这个题目的实现nnnpublic class ThreadDemo02 {nnn public static void main(String[] args) {nn ShareData shareData = new ShareData();nn ...
条件变量虚假唤醒
信号量是有一个值(状态的),而条件变量是没有的,没有地方记录唤醒(发送信号)过多少次,也没有地方记录唤醒线程(wait返回)过多少次。从实现上来说
通过生产者消费者案例理解等待唤醒机制和虚假唤醒
首先引入下面这段生产者和消费者的程序,店员类作为生产产品和消费产品的中介,其中的数据product为共享数据,产品最多只能囤积5个,当产品达到5个还在生产时,就会提示“产品已满!”,类似地,如果产品只有0个了还在消费,会提示“缺货!”:package concurrent;//店员类nclass Clerk {n private int product = 0; // 进货n pu
多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论
NULL 博文链接:https://siwind.iteye.com/blog/1469216
Java多线程之线程虚假唤醒
Java多线程之线程虚假唤醒rnrn本文目录提纲rnrn问题:两个线程对一个初始值为零的变量操作,实现一个线程加一,另一个线程减一,来十次。rn问题:两个线程对一个初始值为零的变量操作,实现一个线程加一,另一个线程减一,来十次。rnrnrn1. 两个线程对一个初始值为零的变量操作,实现一个线程加一,另一个线程减一,来十次。rnrn代码实现:rnclass ShareData{rn private int numbe...
什么是spurious wakeups(虚假唤醒)
查阅了很多资料,发现网上说的很多关于Spurious wakeups 的描述都是错误的。n第一次遇到Spurious wakeups是在使用条件变量时,wait端需要使用while来等待条件变量二不能使用if语句。n如:n// wait端npthread_mutex_lock(mtx);nwhile(pass == 0)n pthread_cond_wai
条件变量的虚假唤醒
这个问题主要来源与我们在使用pthread条件变量wait函数的时候总是使用while去做判断而不是使用if,因为等待在条件变量上的线程被唤醒有可能不是因为条件满足而是由于虚假唤醒(Spurious wakeups)nThat's called spuriousn wakeup and is explicitly allowed by POSIX. Essentially, return fr
线程之间的通信(wait()/notify()机制)——等待唤醒机制
wait() : 使当前同步监视器上的线程进入等待状态, 同时释放锁     对象名.wait()notify() / notifyAll() : 唤醒当前同步监视器上等待状态的一个(所有)线程    对象名.notify()-------------------- 上述方法必须使用在同步方法中(必须在加锁的状态)wait(),notify();notifyAll()这些方法定义在object类原...
条件变量之虚假唤醒 (Spurious wakeup)
虚假唤醒描述了使用某些多线程API(如POSIX线程和Windows API)提供的条件变量的复杂情况。即使在一个条件变量似乎已从等待线程的角度发出信号后,所等待的条件仍可能是错误的。其中一个原因是虚假唤醒; 也就是说,即使没有线程发信号通知条件变量,线程也可能从其等待状态中唤醒。为了正确,有必要在线程完成等待之后验证条件是否为真。由于虚假唤醒可能会重复发生,因此可以通过等待条件为真时终止的循环来...
java虚假唤醒
虚假唤醒就是一些obj.wait()会在除了obj.notify()和obj.notifyAll()的其他情况被唤醒,而此时是不应该唤醒的rnrn解决方法:rnrnpthread_cond_wait的通常使用方法:rnpthread_mutex_lock();rnwhile(condition_is_false)rn    pthread_cond_wait();rnpthread_mutex_u
java并发-假唤醒
假唤醒是程序的错误,指不应该被唤醒却被唤醒了。rnpackage com.concurenny.chapter.eight;nnimport java.util.ArrayList;nimport java.util.List;nn/**n * 创建者:Mr lebron 创建时间:2017年11月17日 下午4:48:11n */npublic class FakeWakeUp {n priva
关于多线程中的虚假唤醒的原因和解决,以及分别用Lock锁和阻塞队列实现消费者生产者案例
虚假唤醒: 有这么一种情况,在一个线程调用wait()进行等待时,被其他线程所唤醒,但是这时同时有另外的线程也被唤醒了,它抢先运行后,使得原来的唤醒条件又不满足了,这时就悲剧了,这个线程就称为被虚假唤醒了。 有人说,它所在的线程是加锁的,唤醒后不是依然不能运行吗,是的,但是它被唤醒了,等到获取锁后,依然会运行。n解决: 所以为了避免这种情况,只好用while循环避免虚假唤醒。(因为if只判断一...
虚假唤醒(spurious wakeup)
n n n 1.Linux对虚假唤醒的说明nnOn a multi-processor, it may be impossible for an implementation of pthread_cond_signal() to avoid the unblocking of more than one thread blocked on a condition v...
线程静态方法sleep()详解以及唤醒线程方法interrupt
//java多线程中的sleep方法,这是一个手动给线程加阻塞的一个方法,当调用sleep方法后线程从运行到阻塞等阻塞时间过后到就绪状态。sleep是一个静态方法因此直接通过Thread调用他与线程对象名无关。nn//下面代码中有一个注意点:在main方法中有一句t1.sleep(2000),是t1线程启动后2s才运行吗?不是,这里就要注意因为sleep是一个静态方法,因此和线程对象是无关的,要看...
Object类中的 notifyAll()方法唤醒后,线程怎么执行
在学习线程协作时,大家都会用到notify()或者notifyAll()方法,最初我对于wait()和notifyAll()方法的印象仅仅是对象锁调用wait方法,使线程进入阻塞状态,等待对象锁执行notify方法将其唤醒。继续执行但最近学习一位大牛的视频,无意间发现一个线程执行的顺序好像跟我想象的不太一样。代码如下:1、计数器线程类:2、唤醒线程3、测试类4、控制台输出:分析:如果只是没有唤醒线...
Java多线程notify/notifyAll唤醒的是谁
涉及JAVA线程的状态问题, 不清楚的可以参考我的另一篇:nnhttps://blog.csdn.net/q5706503/article/details/84350887nn我们知道notify是Object的本地final方法,无法被重写, 用来唤醒线程, 那么该怎么用, 唤醒的又是谁呢?nn用一句话做答复 : notify唤醒的是其所在锁所阻塞的线程nn不理解看下面的分析和例子:nnwait...
Java并发(八)生产消费问题&虚假唤醒
描述生产消费问题在java多线程的学习中是经常遇到的问题 ,多个线程共享通一个资源的时候会出现各种多线程中经常出现的各种问题。实例说明三个类:售货员Clerk,工厂Factory,消费者Consumer nFactory和Consumer共享Clerk对象1.普通情况nClerk类:nclass Clerk{n //商品数量默认是0,volatile关键字保证内存可见性n private
java多线程情况下,while和if的区别
在多线程情况下,如果一个线程进入了if语句块中,在if语句块中执行了wait方法,该线程处于等待(wait)状态,如果该线程被唤醒(notify),不管if的条件是否发生了变化,该线程会执行wait之后的代码,并且会跳出if语句块执行if语句块外面的代码nn nn如果是while,被唤醒了之后,会继续执行wait方法之后的代码,代码块里面的代码执行完了会继续判断条件,如果为true,会继续执行wh...
Java线程之等待wait唤醒notify示例(一)
线程等待,线程唤醒n“锁“中的主要方法 n wait(): 让线程处于冻结状态,被wait的线程会被存储到线程池中。n notify():唤醒线程池中一个线程(任意),没有顺序。n notifyAll():唤醒线程池中的所有线程。n n因为synchronized模块的监视器是任意对象,所以这些方法定义在Object中注意: n**这些方法都必须定义在同步中。因为这些方法是用于操作线程状态
破除java神话之五:等待的线程是按照优先级顺序被唤醒的
摘要:在编写多线程代码的时候经常发生多个线程等待一个事件的情况。这种情况多发生于多个线程在同步方法或者同步块内调用wait方法等待同一个被锁住的对象。当另一个锁住该对象的线程从同步方法或者同步块中调用notify或者notifyAll方法时这些等待线程被唤醒。notify调用仅仅唤醒一个线程,因此如果有多个线程正处于等待状态,那么不会有对锁的竞争。另一方面,notifyAll调用唤醒所有的等待线程...
JUC--AQS源码分析(三)阻塞和唤醒线程
1 概述nn上一篇文章 JUC--AQS源码分析(二)同步状态的获取与释放,我们学习到了同步状态的获取与释放的源码,并且对线程的阻塞和唤醒有了一个初步的了解,这里我们进行深一步的分析。nn2 阻塞nn我们知道在获取线程同步状态失败的时候,会将线程加入到CLH同步队列,并且进行自旋等待。而在自旋等待方法acquireQueued中我们可以看见需要再次进行获取同步状态,如果获取同步状态失败则需要判断当...
线程阻塞与唤醒
线程阻塞与唤醒的方法如图: npackage newThread;import java.util.Scanner;public class Twothread implements Runnable {n private int i;n @Overriden public void run() {n //run方法同样是线程执行体n for(;i<10
线程的等待与唤醒机制
为了更高效的处理一些时间片短,任务量大的任务,我们可能会经常用到多线程。但是多线程的环境下,很容易出现线程并发问题,线程死锁就是很常见的一种并发问题。为了避免此类问题,我们会用到线程间的通信,而等待唤醒机制,就是线程间通信的一种形式。rn等待唤醒机制用到的方法主要有:rnrnpublic final void wait() throws InterruptedException :rn 当前线程必
多线程之等待唤醒机制
简介什么叫做等待唤醒机制呢?举一个栗子,请看下图:当我们开启两条线程时,一条线程专门输入数据,另条取数据。并且要实现,输入一个数据过后,另一方取出一个数据。在多线程的情况下,当输入线程抢到CPU的执行权后,下一次还有可能是输入线程抢到CPU的执行权,就达不到我们想过要的效果。因此,我们需要输入线程执行一次过后,就让它等待,并叫醒输出线程。然后让输出线程执行,执行一次后等待,并且叫醒输入线程。就这样...
【进程&线程】睡眠与唤醒
无法进入临界区的时候选择阻塞而不是忙等待。有sleep和wakeup两个方法。nnnnn信号量semaphorennnup和down两种操作。down做减一操作,如果信号量大于0就减一,不然就睡眠线程。关键在于原子操作,所以一般是在系统层面的。nn首先两个进程同时运行。当A进程想进入临界区的时候执行down操作来做标记,把一般信号量和mutex(互斥锁)都down一遍,这个时候
唤醒线程是否要持有锁(Signal With Mutex Locked Or Not?)
我们经常需要通过某种条件去唤醒和阻塞一个线程,我们唤醒线程时是否需要继续持有锁呢,换句话说我们是先释放锁再唤醒还是先唤醒再释放锁呢?     npthread_mutex_lock(&mutex);npredicate=true;npthread_cond_signal(&cv); // OR: pthread_mutex_unlock(&mutex);npthread_mutex_un
JAVA虚假唤醒
[code=&quot;java&quot;]rn线程虚假唤醒rnhttp://mp.weixin.qq.com/s?__biz=MzA4MTc3Nzk4NQ==&amp;mid=209925758&amp;idx=1&amp;sn=5ef6b5fd423e10ace1d7852d57d5cf12&amp;3rd=MzA3MDU4NTYzMw==&amp;scene=6#rdrnrnhttp://siwind.iteye.com/blog/1469216r...
Java 线程wait()之后一定要notify()才能唤醒吗?
在java方法定义上有: void notify()           唤醒在此对象监视器上等待的单个线程。  void notifyAll()           唤醒在此对象监视器上等待的所有线程。  void wait()           导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。特别地,以上方法只能在同步方法或同步块内部调用...
通过Condition实现wait与指定线程notify
  Object 的 wait / notify / notifyAll 几个方法可以实现对线程的挂起和唤醒。ReentrantLock 也可以,不过要借助我们的 Condition 条件监视器,而且 Object 唤醒部分县城是随机唤醒,Condition 使得线程唤醒是可控的,可以指定唤醒部分线程。 n首先我们用 ReentrantLock 和 Condition 实现 Object 中对应的...
JUC学习之虚假唤醒
public class Test {nn public static void main(String[] args) throws ExecutionException, InterruptedException {n Seller seller = new Seller();n Productor productor = new Productor(sell...
Java线程学习笔记(四)-线程沉睡,唤醒,连接
线程沉睡(sleep)并不会让线程释放它所持有的同步锁,而且在这期间也不会阻碍其他线程的运行。唤醒(interrupt)可以将沉睡或阻塞的线程唤醒。n线程沉睡:线程沉睡可以使当前线程沉睡一段时间,在这段时间内不会有时间片分配给线程。直到过完这段时间,线程又重新运行。n线程唤醒:线程唤醒可以使得执行了sleep操作的线程或执行了wait操作或者join操作的线程唤醒。线程沉睡要指定沉睡的时间,如
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 什么是区什么是区块链技术 什么什么是区块链技术