我帮你找的比较规范点说法:
为什么要使用线程通信?
1.当使用synchronized 来修饰某个共享资源时(分同步代码块和同步方法两种情况),当某个线程获得共享资源的锁后就可以执行相应的代码段,直到该线程运行完该代码段后才释放对该共享资源的锁,让其他线程有机会执行对该共享资源的修改。
2.当某个线程占有某个共享资源的锁 时,如果另外一个线程也想获得这把锁运行就需要使用wait() 和notify()/notifyAll()方法来进行线程通讯了。
结合上面两句话举个例子:就是你上面的例子,如果不用wait,notify的话,只能按第一条说的来执行,这样就很可能出现cpu在一直执行该线程,不切换到另一个线程。(一直执行输出,zhangsan,nan一堆,拉拉,女一堆)如果我想控制让两者交替输出呢?
也就是赋一次值,输出一次。这时候用到第二条。
关于wait(JDK):
前提:当前线程必须拥有此 对象监视器(锁)。
该线程发布(放弃)对此监视器(锁)的所有权并等待,直到其他线程通过调用 notify 方法,
或 notifyAll 方法通知 在此对象的监视器上等待 的线程醒来.
然后该线程将等到 重新获得对监视器的所有权后 才能继续执行。
|