java的锁池和等待池wait notify notifyall

来源:互联网 发布:崩坏3rd网络连接失败 编辑:程序博客网 时间:2024/04/29 20:24

锁池:某个线程中调用了对象锁的notify()方法之后,争夺执行权,进入锁池。

等待池:某个线程中调用了对象锁的wait()方法之后,该线程主动放弃执行权并等待唤醒,进入待待池。


public class ThreadTest{int count=0;Object obj = new Object();public static void main(String[] args) {ThreadTest tt = new ThreadTest();Thread1 t1 = tt.new Thread1();Thread2 t2 = tt.new Thread2();t1.start();t2.start();}class Thread1 extends Thread{public void run(){synchronized (obj) {while(true){System.out.println(Thread.currentThread().getId()+"--"+count);count++;obj.notify();try {obj.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}class Thread2 extends Thread{public void run(){synchronized (obj) {while(true){System.out.println(Thread.currentThread().getId()+"--"+count);count--;obj.notify();try {obj.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}}



输出:
9--0
10--1
9--0
10--1
9--0
10--1
......

需要注意的是,wait()可以设定等待时间。
java.lang.Object.wait(long timeout) 导致当前线程等待,直到其他线程调用此对象的 notify() 方法或notifyAll()方法,或在指定已经过去的时间。
timeout -- 最大等待时间(毫秒)
大约已经到达指定的实际时间。但是,如果 timeout 为零,则不考虑实际时间,在获得通知前该线程将一直等待。 



等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中
锁池:如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩一拉屎就哭怎么办 上火裆部有肿块特别疼怎么办 狗狗拉屎拉不出来怎么办 肛裂大便带血怎么办 辣椒不小心弄丁丁上怎么办 小鸡躺着不动还呼吸怎么办 老人身体不舒服不敢去检查怎么办 金毛上火鼻子干怎么办 狗鼻子干裂结壳怎么办 小狗吐了没精神怎么办 狗狗又吐又拉怎么办 孕妇嘴干鼻子干怎么办 狗狗打了针皮肤变硬怎么办 狗狗得了狗瘟怎么办 金毛得了犬瘟怎么办 泰迪身上起皮怎么办 狗狗鼻子干了怎么办 泰迪生病鼻子干怎么办 痔疮手术后肛门狭窄怎么办 乳腺导管扩张奶头疼怎么办 3月的宝宝要扩肛才拉便便怎么办 怀孕期间肛门长痔疮怎么办 射精后检查尿液发现蛋白尿怎么办 铁距孔被小孩拿体温计塞了怎么办 肛门长了个息肉怎么办 不小心吃了虫卵怎么办 孕妇做四维宝宝不配合怎么办 孕妇四维小孩不配合怎么办 孕妇吃了甜酒酿怎么办 屁股疼的不能动怎么办 小孩打针后手臂疼痛怎么办 屁股打针的地方疼怎么办 眼底坏了怎么办怎么治 大疆无人机飞丢了怎么办 两岁半宝宝发热灌肠后便秘怎么办 发烧灌肠后一直拉稀怎么办 孩子便秘用开塞露引起肚子疼怎么办 老人大便干燥拉不出来怎么办 海底捞排队过号怎么办 脱毛后吃了海鲜怎么办 脂肪填充变丑了怎么办