volatile 和 synchrnoized 关键字进行线程通信
volatile 关键字通过内存原语实现线程间通信(隐式通信,写后将其他线程本地内存无效化)。
synchrnoized 关键字是对对象的监视器(monitor)进行上锁,此方式是排他的。
对象、监视器、同步对象和执行线程的关系:
任意线程对 Object 的访问,首先要获得 Object 的监视器。如果获取失败,线程进入同步队列等待,线程状态变为 BLOCKED。当访问 Object 的前驱释放了锁,则该释放操作唤醒阻塞在同步队列中的线程,使其重新尝试对监视器的获取。
等待/通知机制
wait()、notify() 和 notifyAll() 实现等待/通知模型注意:
- 使用 wait()、notify() 和 notifyAll() 时需要先对调用对象加锁。
- 调用 wait() 方法后,线程状态由 RUNNING 变为 WAITING,并将当前对象放置到对象的等待队列。
- notify() 或 notifyAll() 方法调用后,等待线程依旧不会从 wat() 返回,需要调用 otify() 或 notifyAll() 方法的线程释放锁之后,等待线程才有机会从 wait() 返回。
- notify() 方法将等待队列的一个等待线程从等待队列中移到同步线程中,而 notifyAll() 方法则是将所有等待线程从等待队列中移到同步线程中,被移动的线程状态由 WAITING 变为 BLACKED。
- 从 wait() 方法返回的前提是获得了调用对象的锁。