《java 多线程编程核心技术》读书笔记五

来源:互联网 发布:知乎无法注册 编辑:程序博客网 时间:2024/06/05 06:31

在前面的笔记中我们已经认识了synchronizedvolatile关键字
synchronized:用于方法、代码块,使拥有相同锁的方法、代码块在多个线程中以同步的方式调用
volatile:用于变量(variable)声明处,使对该变量的修改在多个线程中可见

在本文中我们将认识wait()notify()notifyall() 关键字,我们先通过一个生活中常见的场景来解释wait()notify()的使用

信息技术的普及,让我们看病越来越容易,医生也轻松了。以前,去医院找医生看病,需要护士在诊室门口拿个单子,喊:”23号,翠花”!现在大部分医院都不会再出现这个场景了,在诊室门口会有一个显示屏,这个屏幕上会显示当前诊室正在就诊的是谁,候诊人员的排序。

当一个病人挂完号,就会前往相应的诊室,当在屏幕中看到自己的名字显示为候诊时,就会在诊室外面等待。这是因为我们人类有自我判断能力的,那程序在这种情况下改怎么办了?这时就该wait()出场了,当程序判断当前状态为候诊时,当前线程(病人)就调用wait()让程序进入等待状态。

医生看完当前病人后,就会操作门诊医生工作站点击下一位,诊室外面的屏幕就会显示当前需要进入诊室的病人,病人看到自己的状态变成就诊时,就会进入诊室。在程序中,当前线程(医生)就会调用notify()通知处于等待状态的线程继续执行。

wait():使当前执行代码的线程进行等待,wait()是Object类的方法,该方法用来将当前线程置入”预执行队列”中,并且在wait()所在代码行停止执行,直到接到通知或被中断为止。wait()只能在同步方法或同步代码块中执行,因为wait()所在的线程必须先获得对象级别锁。在执行wait()后,当前线程立即释放锁。当接到通知(notify)时,该线程需要与其它线程竞争重新获得锁,如果重新获得锁则执行wait()之后的代码,否则继续等待

notify():该方法用来通知那些可能等待该对象的对象锁的其它线程,如果有多个线程等待,则由线程规划器随机挑选出其中一个呈wait状态的线程,对其发出通知notify,并使它获得相应的对象锁。notify()wait()一样,只能在同步方法或同步代码块中执行。在执行notify()后,当前线程不会立即释放锁,呈wait状态的线程也无法立即获得该相应的对象锁,需要等notify所在的线程将程序执行完后才会释放锁

notify()notifyAll()不同点在于notify()是随机通知一个等待线程,而notifyAll()是通知全部等待线程

public final native void wait(long timeout) throws InterruptedException
timeout:超过这个时间后线程还未被其它线程唤醒,则将自动唤醒

在多线程环境中需要判断某个状态时建议使用while而不是用if,用while判断条件会多次判断,而用if只会判断一次。如果在程序中某个状态被修改了,而线程没有再次判断状态就继续执行,会有导致结果有误的风险。

阅读全文
0 0
原创粉丝点击