摘要:的萬能原子,可見,有序原子性如果一個變量事先未被鎖定,那么不允許對其操作,也不能一個被其他線程鎖定的變量。隱式使用和,保證了和操作之間的代碼是原子的。
synchronized的萬能(原子,可見,有序) 原子性
如果一個變量事先未被Lock鎖定,那么不允許對其unlock操作,也不能unlock一個被其他線程鎖定的變量。
synchronized隱式使用lock和unlock,保證了lock和unlock操作之間的代碼是原子的。
可見性 1.synchronized的內存語義八大happens-before規則中的兩條:
對一個變量執行lock操作,必須清空工作內存中此變量的值,在執行引擎使用該變量之前,重新執行load或assign。
對一個變量unlock操作之前,必須把此變量同步會主內存。
也就是說,
當一個線程獲取一個鎖,這個線程重新從主內存加載最新的數據到本地內存;
當一個線程釋放一個鎖的時候,將該線程本地內存中的最新最正確的數據同步到主內存。
兩者結合,可以看出鎖的釋放,獲取的內存語義可以類比volatile變量的讀/寫的內存語義,鎖的釋放相當于volatile的寫,鎖的獲取相當于volatile的寫。所以鎖具備內存可見性。
2.如何實現這樣的內存語義在JVM規范中可以看到JVM中synchronized的實現原理,JVM基于進入和退出Monitor來實現方法同步和代碼同步,實現細節不一樣,代碼同步使用monitorenter,monitorexit兩個指令實現,編譯器會在同步代碼開始處插入monitorenter指令,在結束處或者異常處插入monitorexit指令,==這兩個字節碼指令隱式使用lock和unlock操作==。
有序性同一時間只有一個線程可以對一個變量進行lock操作,像是把多線程的環境變為了單線程,天然具備有序性(程序順序規則)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71119.html
摘要:當前線程使用將對象頭的替換為鎖記錄指針,如果成功,當前線程獲得鎖如果失敗,表示其他線程競爭鎖,當前線程便嘗試使用自旋來獲取鎖。重量級鎖是悲觀鎖的一種,自旋鎖輕量級鎖與偏向鎖屬于樂觀鎖。 操作系統在面對線程間同步的時候,會支持例如semaphore信號量和mutex互斥量等同步原語,而monitor是在編程語言中被實現的,下面介紹一下java中monitor(監視器/管程:管理共享變量以...
摘要:加鎖,多線程為了防止競爭資源,即防止對同一資源進行并發操作。釋放占有的對象鎖,線程進入等待池,釋放而其他正在等待的線程即可搶占此鎖,獲得鎖的線程即可運行程序。休眠結束,線程重新獲得執行代碼。則是喚醒所有等待的線程。 先了解一下java 模型 showImg(https://segmentfault.com/img/bVbid2W?w=423&h=377); (1)每個線程都有自己的本地...
摘要:從使用到原理學習線程池關于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現在軟件開發中,分散于應用中多出的功能被稱為橫切關注點如事務安全緩存等。 Java 程序媛手把手教你設計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經風雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當初愛情萌芽的模樣…… Java 進階面試問題列表 -...
摘要:語言在之前,提供的唯一的并發原語就是管程,而且之后提供的并發包,也是以管程技術為基礎的。但是管程更容易使用,所以選擇了管程。線程進入條件變量的等待隊列后,是允許其他線程進入管程的。并發編程里兩大核心問題互斥和同步,都可以由管程來幫你解決。 并發編程這個技術領域已經發展了半個世紀了。有沒有一種核心技術可以很方便地解決我們的并發問題呢?這個問題, 我會選擇 Monitor(管程)技術。Ja...
閱讀 2733·2023-04-25 14:21
閱讀 1167·2021-11-23 09:51
閱讀 4001·2021-09-22 15:43
閱讀 606·2019-08-30 15:55
閱讀 1550·2019-08-29 11:28
閱讀 2439·2019-08-26 11:44
閱讀 1675·2019-08-23 18:15
閱讀 2875·2019-08-23 16:42