线程间通信---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)通知所有等待在对象上的线程。

 

 

----摘自《并发编程的艺术》

posted @ 2020-09-07 16:34  kylinmac  阅读(161)  评论(0)    收藏  举报