线程间通信---Synchronized
一、synchronized关键字
Java中的每一个对象都可以作为锁。具体表现为以下3种形式。
-
对于普通同步方法,锁是当前实例对象。
-
对于静态同步方法,锁是当前类的Class对象。
-
对于同步方法块,锁是Synchonized括号里配置的对象。
基于进入和退出Monitor对线实现方法同步和代码块同步。
synchronized对于同步块的实现使用了monitorenter和monitorexit指令,而同步方法则是依靠方法修饰符上的ACC_SYNCHRONIZED来完成的。
无论采用哪种方式,其本质是对一个对象的监视器(monitor)进行获取,而这个获取过程是排他的,也就是同一时刻只能有一个线程获取到由synchronized所保护对象的监视器。
二、等待通知机制
| 方法名称 | 描述 |
| notify() | 通知一个在对象上等待的线程,使其从wait()返回,返回的前提是该对象获取到对象的锁 |
| notifyAll() | 通知所有等待在该对象上的线程 |
| wait() | 线程进入WAITING状态,等待通知或被中断才会返回,wait()会释放对象的锁 |
| wait(long) | 超时等待一段时间,单位毫秒,收到通知或者超时就会返回 |
| wait(long,int) | 对超时时间更细粒度的控制,可达到纳秒 |
三、经典范式
等待方遵循如下原则。
1)获取对象的锁。
2)如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件。
3)条件满足则执行对应的逻辑。
通知方遵循如下原则。
1)获得对象的锁。
2)改变条件。
3)通知所有等待在对象上的线程。
----摘自《并发编程的艺术》

浙公网安备 33010602011771号