java 等待池_java的锁池和等待池wait notify notifyall

锁池:某个线程中调用了对象锁的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值