线程间通信:
其实就是多个线程操作同一个资源,但是操作的动作不同
如下图代码所示,input类正在不停地输入Res类中的name值和sex值,output类正在不停地打野Res类中的name和sex。结果却产生了安全问题(性别颠倒)
针对上图这种情况,我们给input类和output类加上了共同的锁 (r对象),问题得到了暂时的解决。
但是结果却并不是太理想(理想中的结果是 莉莉---女和明哥---男交替出现,而不是成块出现),这是因为input线程和output线程争夺执行权,一旦某一个线程夺得了执行权之后,不会仅仅操作一次就退出。
等待唤醒机制:
wait():等待(线程就进入到了线程池中)
notify():唤醒(唤醒线程池中的一个线程,通常是第一个)
notifyAll():唤醒线程池中的全部线程
jdk手册对wait方法的注释:
因为要对持有监视器(锁)的线程操作,所以要使用在同步中(只有同步才具备锁)
顺便一提,这些方法定义在java的上帝类(object类中),这是因为这些方法操作同步中的线程时,都必须要标识它们所操作的线程具有的锁(只有在同一个锁上的被等待线程,才能被同一个锁上的notify()唤醒,不同锁的中的线程不会被唤醒)也就是说,等待和唤醒必须是同一个锁,而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中。