notify 和 notifyall 唤醒锁
notify 和 notifyall 的区别
先明白两个概念:
锁池:EntryList
等待池:WaitSet
这个时候 再来看 notify 和 notifyall 的区别:
notifyall : 会让所有处于等待池的线程全部进入锁池去竞争获取锁的机会
notify : 只会随机选取一个处于等待池中的线程进入锁池中去竞争获取锁的机会
- public class NotificationDemo {
- private volatile boolean go = false;
- public static void main(String args[]) throws InterruptedException {
- final NotificationDemo test = new NotificationDemo();
- Runnable waitTask = new Runnable(){
- @Override
- public void run(){
- try {
- test.shouldGo();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName() + " finished Execution");
- }
- };
- Runnable notifyTask = new Runnable(){
- @Override
- public void run(){
- test.go();
- System.out.println(Thread.currentThread().getName() + " finished Execution");
- }
- };
- Thread t1 = new Thread(waitTask, "WT1"); //will wait
- Thread t2 = new Thread(waitTask, "WT2"); //will wait
- Thread t3 = new Thread(waitTask, "WT3"); //will wait
- Thread t4 = new Thread(notifyTask,"NT1"); //will notify
- //starting all waiting thread
- t1.start();
- t2.start();
- t3.start();
- //pause to ensure all waiting thread started successfully
- Thread.sleep(200);
- //starting notifying thread
- t4.start();
- }
- /*
- * wait and notify can only be called from synchronized method or bock
- */
- private synchronized void shouldGo() throws InterruptedException {
- while(go != true){
- System.out.println(Thread.currentThread()
- + " is going to wait on this object");
- wait(); //release lock and reacquires on wakeup
- System.out.println(Thread.currentThread() + " is woken up");
- }
- go = false; //resetting condition
- }
- /*
- * both shouldGo() and go() are locked on current object referenced by "this" keyword
- */
- private synchronized void go() {
- while (go == false){
- System.out.println(Thread.currentThread()
- + " is going to notify all or one thread waiting on this object");
- go = true; //making condition true for waiting thread
- //notify(); // only one out of three waiting thread WT1, WT2,WT3 will woke up
- notifyAll(); // all waiting thread WT1, WT2,WT3 will woke up
- }
- }
- }