前言:
眼前姐妹们对“javanotify”大约比较看重,小伙伴们都想要分析一些“javanotify”的相关内容。那么小编在网络上网罗了一些对于“javanotify””的相关文章,希望小伙伴们能喜欢,各位老铁们一起来了解一下吧!notifyall,可以唤醒所有处于wait状态的线程,使其重新进入锁的争夺队列中,而notify只能唤醒一个。
这里注意,任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行同步锁synchronized 中的代码,
notifyall只是让处于wait的线程重新拥有锁的争夺权,
但是同时只会有一个获得锁并执行,锁释放后,其他唤醒的线程可以再次争夺资源。 那么notify和notifyall在实际效果上什么实质区别呢?
本人总觉:
1、主要的效果是notify用得不好的话,很容易导致线程的死锁
2、notify最多能唤醒一个线程,notifyAll将唤醒所有线程
直接看下面的demo吧:
import java.util.concurrent.TimeUnit;public class WaitAndNotifyTest { public static void main(String[] args) { Object lock = new Object(); System.out.println(lock); for (int i = 0; i < 5; i++) { MyThread t = new MyThread("Thread" + i, lock); t.start(); } try { TimeUnit.SECONDS.sleep(2); System.out.println("-----Main Thread notify-----"); synchronized (lock) { //lock.notify();//最多唤醒一个线程 lock.notifyAll();//唤醒所有线程,但只有一个线程可能获得资源 } TimeUnit.SECONDS.sleep(2); System.out.println("Main Thread is end."); } catch (InterruptedException e) { e.printStackTrace(); } } static class MyThread extends Thread { private String name; private Object lock; public MyThread(String name, Object lock) { this.name = name; this.lock = lock; } @Override public void run() { try { synchronized (lock) { System.out.println(name + " is waiting."); lock.wait(); System.out.println(name+"----------was waked--"); } System.out.println(name + " has been notified."); } catch (InterruptedException e) { e.printStackTrace(); } } }}分别切换注释上面的代码运行: //lock.notify();//最多唤醒一个线程 lock.notifyAll();//唤醒所有线程,但只有一个线程可能获得资源运行效果如下:
notify的效果
notifyAll的效果
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #javanotify