1.通信
就是指相互交换一些数据或者发送一些控制指令,比如一个线程给另一个暂停执行的线程发送一个恢复执行的指令。
可变共享变量是天然的通信媒介,也就是说一个线程如果想和另一个线程通信的话,可以修改某个在多线程间共享的变量,另一个线程通过读取这个共享变量来获取通信的内容。
2.这里边就不得不提wait/notify
机制了:
当一个线程获取到锁之后,如果发现条件1不满足,那就主动让出锁(ps:wait使当前线程让出对象锁x1,即x1.wait()),然后把这个线程放到一个等待队列
里等待
去,等到其他某个线程把这个条件1变成ture之后,就通知
等待队列里的线程他们等待的条件满足了,可以继续运行啦(ps:通知某个等待线程竞争到锁之后,进入就绪状态,等待时间片再运行)!
java里规定了每一个锁都对应了一个等待队列
,也就是说如果一个线程在获取到锁之后发现某个条件不满足,就主动让出锁然后把这个线程放到与它获取到的锁对应的那个等待队列里,另一个线程在完成对应条件时需要获取同一个锁,在条件完成后通知它获取的锁对应的等待队列(ps:对象锁x1.notify())
。这个过程意味着锁和等待队列建立了一对一关联。
3.代码格式如下:
synchronized (对象) { 处理逻辑(可选) while(条件不满足) { 对象.wait(); } 处理逻辑(可选) }
获取对象锁。
如果某个条件不满足的话,调用锁对象的wait
方法,被通知后仍要检查条件是否满足。
条件满足则继续执行代码。
原文:https://www.cnblogs.com/hongchengshise/p/10415894.html