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()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池。

    原文作者:java锁
    原文地址: https://blog.csdn.net/qq346610192/article/details/53455795
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞