Concurrency: 互斥鎖屬性及Monitor對(duì)象

調(diào)用wait()會(huì)進(jìn)入到WaitSet集合中,一直等到其他獲取鎖的線程釋放鎖,從WaitSet集合中出來(lái)之后,會(huì)繼續(xù)競(jìng)爭(zhēng)對(duì)象的鎖,如果沒(méi)有競(jìng)爭(zhēng)到,那么會(huì)進(jìn)入到EntryList集合中。
阻塞態(tài)是處于內(nèi)核態(tài)的,可以通過(guò)自旋解決(Spin)避免線程阻塞。


互斥鎖的屬性:

  1. PTHREAD_MUTEX_TIME_NP: 這是缺省值,也就是普通鎖。當(dāng)一個(gè)線程加鎖以后,其余請(qǐng)求這把鎖的線程,其余等待這把鎖的線程將會(huì)形成一個(gè)等待隊(duì)列,并且在解鎖后按照優(yōu)先級(jí)獲取到鎖,這種策略可以確保資源分配的公平性。
  2. PTHREAD_MUTEX_RECURSIVE_NP: 嵌套鎖,允許同一個(gè)線程對(duì)同一把鎖成功獲取到多次,并且通過(guò)unlock解鎖,如果是不同線程請(qǐng)求,則在加鎖線程解鎖時(shí),重新進(jìn)行競(jìng)爭(zhēng)??芍厝腈i,JDK1.5引入的。
  3. PTHREAD_MUTEX_ERRORCHECK_NP: 檢錯(cuò)鎖,如果一個(gè)線程請(qǐng)求同一把鎖,則返回EDEADLK,否則與PTHREAD_MUTEX_TIME_NP的動(dòng)作相同,這樣就保證了當(dāng)不允許多次加鎖時(shí),不會(huì)出現(xiàn)最簡(jiǎn)單情況下的死鎖。
  4. PTHREAD_MUTEX_ADAPTIVE_NP:適應(yīng)鎖,動(dòng)作最簡(jiǎn)單的鎖類型,僅僅等待解鎖后重新競(jìng)爭(zhēng),不考慮優(yōu)先級(jí)。

通過(guò)底層的源碼了解Monitor對(duì)象:
JDK很多API開源的,但是很多還是不開源的,比如com.sun.*下面的API
openjdk源碼

objectMonitor.hpp
{
 _header       = NULL;
 _count        = 0;
 _waiters      = 0,
 _recursions   = 0;volatile intptr_t  _recursions;   // recursion count, 0 for first entry
 _object       = NULL;
 _owner        = NULL;//void *  volatile _owner;          // pointer to owning thread OR BasicLock
 _WaitSet      = NULL; //ObjectWaiter * volatile _WaitSet; // LL of threads wait()ing on the monitor
 _WaitSetLock  = 0 ;volatile int _WaitSetLock;        // protects Wait Queue - simple spinlock
 _Responsible  = NULL ;
 _succ         = NULL ;
 _cxq          = NULL ;ObjectWaiter * volatile _cxq ;    // LL of recently-arrived threads blocked on entry. // The list is actually composed of WaitNodes, acting // as proxies for Threads.
 FreeNext      = NULL ;
 _EntryList    = NULL ;//ObjectWaiter * volatile _EntryList ;     // Threads blocked on entry or reentry.
 _SpinFreq     = 0 ;
 _SpinClock    = 0 ;
 OwnerIsThread = 0 ;
 _previous_owner_tid = 0;
 }

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 線程安全是怎么產(chǎn)生的 常見比如線程內(nèi)操作了一個(gè)線程外的非線程安全變量,這個(gè)時(shí)候一定要考慮線程安全和同步。 - (v...
    幽城88閱讀 774評(píng)論 0 0
  • 鎖是一種同步機(jī)制,用于多線程環(huán)境中對(duì)資源訪問(wèn)的限制iOS中常見鎖的性能對(duì)比圖(摘自:ibireme): iOS鎖的...
    LiLS閱讀 1,631評(píng)論 0 6
  • 多線程系列文章源碼頭文件內(nèi)容: #include #include #include 作為程序員,就是要減少重復(fù)勞...
    batbattle閱讀 1,076評(píng)論 0 1
  • 一、簡(jiǎn)介:多線程在之前進(jìn)行過(guò)一篇詳細(xì)的基礎(chǔ)博客 iOS多線程 二、多線程的基礎(chǔ)知識(shí)回顧 1.1、iOS中的常見多線...
    IIronMan閱讀 1,030評(píng)論 0 4
  • 現(xiàn)在耐不住 電視劇的吸引 注意力時(shí)不時(shí)的往過(guò)去看! 講講從前的經(jīng)歷 首先,自己以前是特別喜歡看電視的,(電影 動(dòng)畫...
    趙揚(yáng)帆閱讀 354評(píng)論 0 0

友情鏈接更多精彩內(nèi)容