Monitor結構解讀之EntryQ和WaitSet的區別

EntryQ(或_EntryList)和WaitSet(或_WaitSet)在Java的monitor機制中扮演著不同的角色,它們之間的主要區別體現在以下幾個方面:

1. 等待原因和機制

  • EntryQ(或_EntryList)
    • 等待原因:EntryQ(或_EntryList)用于存放所有等待獲取鎖的線程。當多個線程嘗試進入一個同步塊(即嘗試獲取對象的鎖)時,如果鎖已經被其他線程持有,那么這些線程就會進入該對象的EntryQ(或_EntryList)。
    • 機制:這是一種鎖競爭的情況。線程在EntryQ(或_EntryList)中等待,直到鎖變得可用。一旦鎖被釋放,處于EntryQ(或_EntryList)的線程將嘗試獲取鎖。如果成功,它將離開EntryQ(或_EntryList)并進入同步塊;如果失敗,它將繼續留在EntryQ(或_EntryList)中等待。
  • WaitSet(或_WaitSet)
    • 等待原因:WaitSet(或_WaitSet)用于存放所有在monitor上調用wait()方法而進入等待狀態的線程。這通常發生在一個線程需要等待某個特定條件變為真時,例如等待某個資源變得可用或等待某個條件滿足。
    • 機制:線程在WaitSet(或_WaitSet)中等待,直到它被另一個線程通過調用相同對象的notify()或notifyAll()方法喚醒。在等待集中的線程不會競爭對象鎖。

2. 線程狀態

  • EntryQ(或_EntryList)中的線程:這些線程處于BLOCKED狀態,即它們正在等待獲取鎖。
  • WaitSet(或_WaitSet)中的線程:這些線程處于WAITING狀態,即它們已經釋放了鎖并在等待某個條件的變化。

3. 鎖的行為

  • EntryQ(或_EntryList):線程在EntryQ(或_EntryList)中競爭鎖,一旦鎖被釋放,它們將嘗試獲取鎖。這是實現monitor互斥功能的關鍵部分。
  • WaitSet(或_WaitSet):線程在WaitSet(或_WaitSet)中不參與鎖的競爭。它們等待的是條件的變化,并在條件滿足且被喚醒后重新嘗試獲取鎖。

4. 喚醒后的行為

  • 當WaitSet(或_WaitSet)中的線程被notify()或notifyAll()喚醒時,它們并不會立即執行。被喚醒的線程首先必須重新獲得與該對象關聯的鎖。如果鎖當前被其他線程持有,那么這個剛被喚醒的線程將會進入EntryQ(或_EntryList),在那里等待直到鎖變得可用。
  • 一旦線程在EntryQ(或_EntryList)中獲得鎖,它將離開該隊列并進入同步塊或方法,繼續執行其任務。

總之,EntryQ(或_EntryList)和WaitSet(_或WaitSet)在Java的monitor機制中分別管理著等待獲取鎖的線程和等待條件變化的線程。它們通過不同的機制來確保線程同步的正確性和高效性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43128.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43128.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43128.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試常考題---128陷阱(詳細)

1.問題引入 分別引入了int和Integer變量,并進行比較 int b 128; int b1 128;Integer d 127; Integer d1 127;Integer e 128; Integer e1 128;System.out.println(bb1); System.out.println(dd1); System.out.println(ee1); System.out.println(e.equals(e1)…

刷題(day01)

1、leetcode485.最大連續1的個數 給定一個二進制數組 nums , 計算其中最大連續 1 的個數。 示例 1: 輸入:nums [1,1,0,1,1,1] 輸出:3 解釋:開頭的兩位和最后的三位都是連續 1 ,所以最大連續 1 的個數是 3.…

Nginx 高效加速策略:動靜分離與緩存詳解

在現代Web開發中,網站性能是衡量用戶體驗的關鍵指標之一。Nginx,以其出色的性能和靈活性,成為眾多網站架構中不可或缺的一部分。本文將深度解析如何利用Nginx實現動靜分離與緩存,從而大幅提升網站加載速度和響應效率。 理解動靜分…

昇思第18天打卡|ShuffleNet圖像分類

ShuffleNet網絡介紹 ShuffleNetV1是曠視科技提出的一種計算高效的CNN模型,和MobileNet, SqueezeNet等一樣主要應用在移動端,所以模型的設計目標就是利用有限的計算資源來達到最好的模型精度。ShuffleNetV1的設計核心是引入了兩種操作:Pointw…

張大哥筆記:你一旦開竅,就會發現遍地都是錢

大家有沒有發現,窮人總是追逐眼前的利益,總是在追著錢跑,卻總是賺不到錢。而富人有著長遠的見識,追著問題跑,最后卻賺的盆滿缽滿。 我們聽過這樣一句話,錢不是賺來的,而是幫助別人解決問題后給你…

【計算機】同步/異步

同步/異步 在計算機科學和編程中,“同步”(Synchronization)是一種機制,用于協調不同進程或線程之間的操作,以避免競態條件(race conditions)、死鎖(deadlocks)和其他并…

Qt/C++編寫地圖應用/離線地圖下載/路徑規劃/軌跡回放/海量點/坐標轉換

一、前言說明 這個地圖組件寫了很多年了,最初設計的比較粗糙,最開始只是為了滿足項目需要,并沒有考慮太多拓展性,比如最初都是按照百度地圖寫死在代碼中,經過這幾年大量的現場實際應用,以及大量的用戶提出…

Django 新增數據 save()方法

1,添加模型 Test/app11/models.py from django.db import modelsclass Book(models.Model):title models.CharField(max_length100)author models.CharField(max_length100)publication_date models.DateField()price models.DecimalField(max_digits5, decim…

BFC 是什么?

BFC 是塊級格式化上下文(Block Formatting Context)的縮寫,是 CSS 中一個重要的概念,用于控制塊級盒子的布局及浮動元素的交互。BFC 是一個獨立的渲染區域,內部的塊級盒子會按照特定的規則進行布局,不會影響…

軟件工程(上)

目錄 軟件過程模型(軟件開發模型) 瀑布模型 原型模型 V模型 構件組裝模型 螺旋模型(原型瀑布) 基于構件的軟件工程(CBSE) 快速應用開發模型(RAD) 統一過程(UP&a…

Linux學習看這一篇就夠了,超超超牛的Linux基礎入門

引言 小伙伴們,不管是學習c還是學習其他語言在我們學的路上都繞不過操作系統,而且,老生常談的Linux更是每個計算機人的必修,那么我們對Linux的了解可能只是從別人那聽到的簡單的這個系統很牛,巴拉巴拉的,但…

大模型日報 2024-07-08

大模型日報 2024-07-08 大模型資訊 Anthropic CEO:大模型訓練成本暴漲,2027年將達1000億美元! Anthropic首席執行官表示,當前AI模型訓練成本是10億美元,未來三年,這個數字可能會上升到100億美元甚至1000億美…

GitLab管理員常用配置及設置匯總

? 之前在 虛擬機Ubuntu 22.04上搭建GitLab操作步驟 上介紹了在Ubuntu 22.04上如何搭建社區版的GitLab,這里整理下作為GitLab管理員時在搭建完GitLab CE后,如何對其進行配置或設置 更改倉庫存儲位置:切換到root用戶下操作 默認存放位置&…

SSL 證書

自動獲取 Lets Encrypt 免費證書 (適用于 Linux 系統) 安裝 Certbot sudo apt-get update sudo apt-get install certbot python3-certbot-nginx # Nginx 服務器 sudo apt-get install certbot python3-certbot-apache # Apache 服務器 獲取和安裝證…

小米rdemi紅米ax3000t刷機 20240707最新配套完整程序整理合集

小米rdemi紅米ax3000t刷機程序地址: https://www.123pan.com/s/LA1bVv-EOzVv.html 小米路由器SSH密碼計算器 https://www.1234f.com/fuwu/ax3000t/ 最新更新地址:https://www.1234f.com/fuwu/openwrt/ 依次輸入如下命令: curl -X POST h…

Leetcode 295.數據流的中位數

295.數據流的中位數 問題描述 中位數是有序整數列表中的中間值。如果列表的大小是偶數,則沒有中間值,中位數是兩個中間值的平均值。 例如 arr [2,3,4] 的中位數是 3 。例如 arr [2,3] 的中位數是 (2 3) / 2 2.5 。 實現 MedianFinder 類: Media…

算法013:水果成籃

水果成籃. - 備戰技術面試?力扣提供海量技術面試資源,幫助你高效提升編程技能,輕松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/fruit-into-baskets/ 這道題題目很長,仔細閱讀過后,我們其實可以簡化成&#xff…

MySQL 9.0新特性:向量存儲

MySQL 9.0 正式版已經發布,其中一個亮點就是向量(VECTOR)數據類型的支持,本文給大家詳細介紹一下這個新功能。 向量類型 MySQL 9.0 增加了一個新的向量數據類型:VECTOR。它是一種可以存儲 N 個數據項的數據結構&…

Redis Stream:實時數據流的處理與存儲

Redis Stream:實時數據流的處理與存儲 引言 在當今數據驅動的世界中,實時數據處理和存儲成為了許多應用的核心需求。Redis Stream作為一種新興的數據結構,為Redis帶來了強大的流處理能力。本文將深入探討Redis Stream的特點、使用場景以及如何高效地利用它來處理實時數據流…