synchronized的底層JVM實現機制
互斥
JVM 通過物件鎖來實現互斥:
typedef struct object {
uintptr_t lock;
Class *class;
} Object
協作協作是通過 Object wait, notify/notifyAll 方法實現的。
對應到JVM 的底層術語,這一機制叫做 monitor:
typedef struct monitor { pthread_mutex_t lock; Thread *owner; Object *obj; int count; int in_wait; uintptr_t entering; int wait_count; Thread *wait_set; struct monitor *next; } Monitor;
在不同區域的 Thread 對應的狀態(Java Thread 的狀態圖):
在底層的JVM 或許會有更多的狀態,但是,暴露在 Java Thread 的狀態是在 java.lang.Thread 中定義的,注意 JDK 6 修訂了 interrupt 的語義。
比如,在底層,進行獲取 lock 動作到獲得 lock 之間有一小段狀態叫做 BLOCKED:
void monitorLock(Monitor *mon, Thread *self) { if(mon->owner == self) mon->count++; else { if(pthread_mutex_trylock(&mon->lock)) { disableSuspend(self); self->blocked_mon = mon; self->blocked_count++; self->state = BLOCKED; pthread_mutex_lock(&mon->lock); self->state = RUNNING; self->blocked_mon = NULL; enableSuspend(self); } mon->owner = self; } }
相關推薦
synchronized的底層JVM實現機制
Java synchronized 包含兩方面的含義互斥JVM 通過物件鎖來實現互斥:typedef struct object { uintptr_t lock; Class *class; } Object協作協作是通過 Object wait, notify/noti
STL及一些容器底層實現機制
失效 list容器 容量 較高的 浪費 復制 處理 跳轉 strong 1、vector容器 vector的數據安排以及操作方式,與數組類似。倆這唯一的區別就是空間的運用靈活性。數組是靜態空間,一旦配置了就不能改變,vector是動態數組。在堆上分配內存。vector是動態
synchronized底層實現原理
進入時:monitorenter 每個物件有一個監視器鎖(monitor)。當monitor被佔用時就會處於鎖定狀態,執行緒執行monitorenter指令時嘗試獲取monitor的所有權,過程如下:1、如果monitor的進入數為0,則該執行緒進入monitor,然後將進入數設定為1,該執行緒即為moni
objective-c程式碼轉c++程式碼,瞭解底層實現機制
1、開啟終端,輸入 clang -rewrite-objc main.m 2、有時會遇到找不到系統庫的標頭檔案,如 解決辦法: 指定模擬器: xcrun -sdk iphonesimulator
死磕Synchronized底層實現--概論
關於synchronized的底層實現,網上有很多文章了。但是很多文章要麼作者根本沒看程式碼,僅僅是根據網上其他文章總結、照搬而成,難免有些錯誤;要麼很多點都是一筆帶過,對於為什麼這樣實現沒有一個說法,讓像我這樣的讀者意猶未盡。 更多文章見個人部落格:github.com/farmerjohng… 本系列
死磕Synchronized底層實現--偏向鎖
本文為synchronized系列第二篇。主要內容為分析偏向鎖的實現。 偏向鎖的誕生背景和基本原理在上文中已經講過了,強烈建議在有看過上篇文章的基礎下閱讀本文。 更多文章見個人部落格:github.com/farmerjohng… 本文將分為幾塊內容: 1.偏向鎖的入口 2.偏向鎖的獲取流程 3.
死磕Synchronized底層實現--輕量級鎖
本文為死磕Synchronized底層實現第三篇文章,內容為輕量級鎖實現。 輕量級鎖並不複雜,其中很多內容在偏向鎖一文中已提及過,與本文內容會有部分重疊。 另外輕量級鎖的背景和基本流程在概論中已有講解。強烈建議在看過兩篇文章的基礎下閱讀本文。 本系列文章將對HotSpot的synchronized鎖實現
死磕Synchronized底層實現--重量級鎖
本文為死磕Synchronized底層實現第三篇文章,內容為重量級鎖實現。 本系列文章將對HotSpot的synchronized鎖實現進行全面分析,內容包括偏向鎖、輕量級鎖、重量級鎖的加鎖、解鎖、鎖升級流程的原理及原始碼分析,希望給在研究synchronized路上的同學一些幫助。主要包括以下幾篇文章:
Java程式設計師必知的併發程式設計藝術——併發機制的底層原理實現
Java程式語言允許執行緒訪問共享變數,為了確保共享變數能被準確和一致的更新,執行緒應該確保通過排他鎖單獨獲得這個變數。 volatile藉助Java記憶體模型保證所有執行緒能夠看到最新的值。(記憶體可見性) 實現原理: 將帶有volatile變數操作的Java程式碼轉
jvm synchronized底層設計與優化
通常來講synchronized被當做重量級鎖來使用,但其實它並不是一味地阻塞當前執行緒,而是通過鎖升級等方式進行了很多的優化。 一 重量級鎖(互斥同步或悲觀鎖) 最原始的,也是synchronized與生俱來的同步方式。 使用synchronized可以指定一
Linux:訊號的底層實現機制
1.訊號:系統先定義好的某些特定的事件,可以被髮生,也可以被接受。發生和接受的主體都是程序。 2.訊號機制:系統預先定義好的一些事件 3.程序對訊號的響應方式:當程序發生時,使用者可以要求程序以以下三種方式之一對訊號做出響應: a.預
JVM Attach機制實現
感謝支付寶同事【寒泉子】的投稿 attach是什麼 在講這個之前,我們先來點大家都知道的東西,當我們感覺執行緒一直卡在某個地方,想知道卡在哪裡,首先想到的是進行執行緒dump,而常用的命令是jstack <pid>,我們就可以看到如下執行緒棧了 大家是否注意過上面圈起來的兩個執
synchronized底層實現學習
上文我們總結了 synchronized 關鍵字的基本用法以及作用,並未涉及 synchronized 底層是如何實現的,所謂刨根問底,本文我們就開始 synchronized 原理的探索之旅吧(*>﹏<*)。 1. 物件鎖是什麼 不同於ReentrantL
vue三要素及底層實現機制
深入解析Vue 我們首先來熟悉一下我們這個文件所學習內容的流程。 先對比一下jQuery和Vue的區別,再講述Vue的MVVM模型,接著講解Vue的實現流程。 當然,我是不相信沒有對比哪來的傷害,沒有傷害哪能讓人記憶深入骨髓咧,向來都是被傷害過的人我才會記得你,我要恨你一
[五]類載入機制雙親委派機制 底層程式碼實現原理 原始碼分析 java類載入雙親委派機制是如何實現的
Launcher啟動類 本文是雙親委派機制的原始碼分析部分,類載入機制中的雙親委派模型對於jvm的穩定執行是非常重要的 不過原始碼其實比較簡單,接下來簡單介紹一下 我們先從啟動類說起 有一個Launcher類 sun.misc.Launcher; 仔細看下這簡
iOS底層原理總結-- 深入理解 KVC\KVO 實現機制
iOS底層原理總結–OC物件的本質(一) - 掘金 iOS底層原理總結–OC物件的本質(二) - 掘金 iOS底層原理總結–OC物件的分類:instance、class、meta-calss物件的isa和superclass - 掘金 iOS底層原理總結-- KVO/KVC的本質
linux--fork()函式詳解及底層實現機制
fork底層實現機制:Linux中實現為呼叫clone函式,然後為do_fork,再然後copy_process()複製程序(複製相應資料結構例如:核心棧、thread_info、task_
Java中hashset底層實現機制
今天寫演算法,遇到了這個問題:HashSet<int[]> hs = new HashSet<>(); int[] arr1 = {4,5}; int[] arr2 = {4,5}; hs.add(arr1); hs.add(arr2); System
深入JVM鎖機制1-synchronized
資料同步需要依賴鎖,那鎖的同步又依賴誰?synchronized給出的答案是在軟體層面依賴JVM,而Lock給出的方案是在硬體層面依賴特殊的CPU指令,大家可能會進一步追問:JVM底層又是如何實現synchronized的? 本文所指說的JVM是指Hotspot的6u23版本,下面首先介紹s
【轉】Synchronized底層實現--概論
關於synchronized的底層實現,網上有很多文章了。但是很多文章要麼作者根本沒看程式碼,僅僅是根據網上其他文章總結、照搬而成,難免有些錯誤;要麼很多點都是一筆帶過,對於為什麼這樣實現沒有一個說法,讓像我這樣的讀者意猶未盡。 本系列文章將對HotSpot的synchronized鎖實現進行全