为了账号安全,请及时绑定邮箱和手机立即绑定

关于多线程notify的问题

关于多线程notify的问题

呼唤远方 2019-03-01 11:04:54
public class WaitTest { static class ThreadA extends Thread { public ThreadA(String name){ super(name); } @Override public void run() { synchronized (this){ System.out.println(Thread.currentThread().getName()+" call notify()"); //notify();//notify之后 要等到这个代码块结束之后才会把锁让出去,当然如果在notify之后又有wait,那就会主动把锁让出去 try { System.out.println(Thread.currentThread().getName()+" wait"); //wait(); //Thread.sleep(10000); } catch (Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" after notify"); } } } public static void main(String[] args) throws InterruptedException { ThreadA t1 =new ThreadA("t1"); synchronized (t1){ System.out.println(Thread.currentThread().getName()+" start t1"); t1.start(); System.out.println(Thread.currentThread().getName()+" wait"); t1.wait();// //System.out.println(Thread.currentThread().getName()+" notify"); // t1.notify(); System.out.println(t1.getName()); System.out.println(Thread.currentThread().getName()+" continue"); //t1.notify(); } } } 照理来说 t1.wait() 应该会阻塞主线程,并没有其他地方notify而去掉t1.start()之后,就能阻塞住了 这是什么道理?编译器优化?还是synchronized代码块内如果不对monitor进行操作,结束主动notify??
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

并不是优化其实,跟线程的执行有关的。在java doc中,public final synchronized void join(long millis)这个方法的注释上面写着一句话

<p> This implementation uses a loop of {@code this.wait} calls conditioned on {@code this.isAlive}. As a thread terminates the {@code this.notifyAll} method is invoked. It is recommended that applications not use {@code wait}, {@code notify}, or {@code notifyAll} on {@code Thread} instances.

看到加黑体,其实是线程结束之后调用的notifyAll导致wait苏醒的。并不是什么虚拟机优化导致的。希望能解答你的困惑

查看完整回答
反对 回复 2019-03-01
  • 1 回答
  • 0 关注
  • 513 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号