wait和notify函数的规范代码模板

// The standard idiom for calling the wait method in Java
synchronized (sharedObject) {
    while (condition) {
sharedObject.wait();
        // (Releases lock, and reacquires on wakeup)
    }
    // do action based upon condition e.g. take or put into queue
} 

⑤多线程中测试某个条件的变化用 if 还是用 while?

说是要把if换成while的理由,应该是wait线程被唤醒之后,会继续从wait那里往下面执行,如果是if的话,就会直接往下面执行,不会再判断if的状态了;但是如果是while的话,从wait那里往下面执行,然后还会判断while中的条件,如果==0的话,还是会继续阻塞,如果是>0,则会执行while语句块外面的remove吧?!其中关键就是被notify唤醒之后,是否会执行条件判断

 

http://www.cnblogs.com/hapjin/p/5492645.html

时间: 2024-12-28 23:00:39

wait和notify函数的规范代码模板的相关文章

Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)

一.Qt中事件处理的方式 1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是每个事件都对应同一个事件处理器,在该事件处理器中对不同的事件进行分类处理,这样的弊端有两点:第一,导致该事件处理器过于臃肿复杂:第二,这样不便于扩展,当系统新增加事件类型或者是我们需要使用到自定义事件时,就不得不修改Qt的源码来达到目的.所以Qt设计者的做法是针对不同类型的事件提供不同的事件处理器与之对

写好函数的规范小结

<代码整洁之道>第三章的阅读小结. 写好函数: 1,短小!20行左右就是上限. 2,只做一件事!这是最重要的一点.要判断函数是否只做了一件事的方法就是看能否再拆出来一个函数. 3,每个函数一个抽象层级.自顶向下读代码:向下原则.每个函数引出下一个函数. 4,switch语句应该埋在抽象工厂底下.而面对不同类型该做不同操作的功能用多态来实现. 5,使用描述性的名称.长而具有描述性的名称最佳.命名方式(风格)应该保持一致 6,函数参数:最佳是零参数,其次是单参数,再次是二,应避免三参数及以上. 7

C语言变量和函数命名规范

变量名规则第一个字母: 局部 l. 全局 g第二个字母: bit(bt). bool(b). char(c). int(i). short(s). long(l). unsigned(u). double(d). float(f).  pointer(p). enum(st). struct(st). union(st)例子: int liWidth;           struct Person gstPerson;           char gcUsedFlag;           

notify和notifyAll有什么区别?

先说两个概念:锁池和等待池 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中.等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池中 在java中,每个对象都有两个池,锁(monitor

多线程-生产者消费者

正解博客:https://blog.csdn.net/u011863767/article/details/59731447 永远在循环(loop)里调用 wait 和 notify,不是在 If 语句 现在你知道wait应该永远在被synchronized的背景下和那个被多线程共享的对象上调用,下一个一定要记住的问题就是,你应该永远在while循环,而不是if语句中调用wait.因为线程是在某些条件下等待的--在我们的例子里,即"如果缓冲区队列是满的话,那么生产者线程应该等待",你可

生产者消费者模式中条件判断是使用while而不是if

永远在循环(loop)里调用 wait 和 notify,不是在 If 语句现在你知道wait应该永远在被synchronized的背景下和那个被多线程共享的对象上调用,下一个一定要记住的问题就是,你应该永远在while循环,而不是if语句中调用wait.因为线程是在某些条件下等待的--在我们的例子里,即"如果缓冲区队列是满的话,那么生产者线程应该等待",你可能直觉就会写一个if语句.但if语句存在一些微妙的小问题,导致即使条件没被满足,你的线程你也有可能被错误地唤醒.所以如果你不在线

Java 生产者模式 消费者模式

1 // The standard idiom for calling the wait 2 synchronized(sharedObject) { 3 while(condition){ 4 sharedObject.wait();// Releases lock, and reacquires on wake up 5 } 6 // do action based upon condition e.g. take or put into queue 7 } 使用wait和notify函数的

函数可重入性及编写规范

一.可重入函数1)什么是可重入性?可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误.相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断).可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据.可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据. 2)可重入函数:不为连续的调用持有静态数据. 不返回指向静态数据的指针:所有数据都由函数的调用者提供. 使用本地

线程安全和可重入函数

一.线程安全 1.线程安全函数:C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的. (1)对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量.局部静态变量.分配于堆的变量都是共享的,即是非线程安全的. (2) 在对这些共享变量进行访 问时,如果要保证线程安全,则必须通过加锁的方式. 2.线程安全的:                   如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的.