并发编程 - lost wakeup
Java中wait()方法為什么要放在同步塊中?(lost wake-up 問題):
https://www.cnblogs.com/sunweiye/p/11055550.html
lost wakeup問題
sleep 和 wakeup使用于等待某事發生,用于阻塞和喚醒線程的情形中。
所以sleep的使用邏輯是:檢查狀態,不符合則調用sleep阻塞當前線程;wakeup的使用邏輯是:改變狀態,調用wakeup喚醒對應線程。
lost wakeup問題:(1)線程1首先檢查狀態,發現不符合。(2)線程2改變狀態,調用wakeup方法。但是這時線程1還未調用sleep方法,其還未被阻塞,所以wakeup丟失。(3)最后線程1調用sleep方法,阻塞線程,且無法再被喚醒。
解決方案
sleep 和 wakeup必須位于同一同步塊中,且保證sleep方法保證釋放鎖和阻塞線程的原子性。線程1和線程2在檢查/改變狀態之前都要先獲取鎖,sleep方法調用時釋放鎖,保證線程2無法在線程1檢查狀態之后,調用sleep方法之前改變狀態,并調用wakeup。
sleep方法保證釋放鎖和阻塞線程的原子性在應用層面很難實現,所以JAVA AQS中先釋放鎖,再阻塞線程,所以還是會有lost wakeup問題。但是如果wakeup喚醒的對應線程還未被阻塞的話(即釋放鎖之后,阻塞線程之前),會重復調用wakeup函數,直到對應線程被阻塞,然后對其喚醒。
總結
以上是生活随笔為你收集整理的并发编程 - lost wakeup的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pyspark学习笔记1——配置环境并计
- 下一篇: 物联网终端电池使用简单介绍