第3章-GuardedSuspension
分类:
文章
•
2024-08-25 18:38:04
3.1 模式简介
- 当你正在家换衣服时,门铃突然响了,原来是邮递员来送邮件了。这时,因为正在换衣服出不去,所以只能先喊道 “请稍等一下” 让邮递员在门口稍等一会儿。换好衣服后,才说着 “让您久等了” 并打开门。
- Guarded是 “被守护、被保卫、被保护” 的意思,Suspension则是 “暂停” 的意思。如果执行现在的处理会造成问题,就让执行处理的线程进行等待——这就是Guarded Suspension模式。
- Guarded Suspension模式通过让线程等待来保证实例的安全性。这正如同你让邮递员在门口等待,以保护个人隐私一样。
- Guarded Suspension 模式还有 guarded wait、spin lock等称呼。
3.3 Guarded Suspension模式中的角色
3.3.1 GuardedObject(被守护的对象)
- GuardedObject角色是一个持有被守护的方法(guardedMethod)的类。
- 当线程执行guardedMethod方法时,若守护条件成立,则可以立即执行;当守护条件不成立时,就要进行等待。
- 守护条件的成立与否会随着GuardedObject角色的状态不同而发生变化。
- 除了guardedMethod之外,GuardedObject角色还有可能持有其他改变实例状态(特别是改变守护条件)的方法(stateChangingMethod)。
- 在Java中,guardedMethod通过while语句和wait方法来实现,statechangingMethod则通过notify/notifyAlls方法来实现。
3.3.2 类图和Timethreads图


3.4 拓展思路的要点
3.4.1 附加条件的 synchronized
- 在Single Threaded Execution模式中,只要有一个线程进入临界区,其他线程就无法进入,只能等待。
- 而在Guarded Suspension模式中,线程是否等待取决于守护条件。Guarded Suspension模式是在Single Threaded Execution模式的基础上附加了条件而形成的。也就是说,Guarded Suspension模式是类似于 “附加条件的synchronized” 这样的模式。
3.4.2 忘记改变状态与生存性
- 正在wait的线程每次被notify/notifyAll时都会检查守护条件。不管被notify/notifyAll多少次,如果守护条件不成立,线程都会随着while再次wait。
- 如果程序错误,没有修改GuardedObject角色的状态的处理,那么守护条件永远都不会成立。这时,不管执行多少次notify/notifyAll,线程处理都无法继续,程序也就失去了生存性。
- wait一段时间之后,如果还没有notify/notifyAll,我们或许就想中断处理。在这种情况下,可以在调用wait方法时,在参数中指定超时(timeout)时间。
3.4.3 java.util.concurrent.LinkedBlockingQueue
- LinkedBlockingQueue类实现了java.util.concurrent.BlockingQueue接口,take方法和put方法都是BlockingQueue接口中声明的方法。take方法用于“取出队首元素”,put方法则用于“向队列末尾添加元素”。当队列为空时,若调用take方法便会进行wait。