日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

并发编程 - lost wakeup

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并发编程 - 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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。