您好,登錄后才能下訂單哦!
本篇內容介紹了“Java中各種鎖的介紹”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
應用 CAS 思想 一種樂觀思想,假定當前環境是讀多寫少,遇到并發寫的概率比較低,讀數據時認為別的線程不會正在進行修改 實現 寫數據時,判斷當前 與期望值是否相同,如果相同則進行更新(更新期間加鎖,保證是原子性的)
應用 synchronized、vector、hashtable 思想: 一種悲觀思想 ** ,即認為寫多讀少,遇到并發寫的可能性高 實現 每次讀寫數據都會認為其他線程會修改,所以每次讀寫數據時都會上鎖 缺點 他線程想要讀寫這個數據時,會被這個線程block,直到這個線程釋放鎖然后其他線程獲取到鎖
應用 CAS 實現 為了讓線程等待,我們只須讓線程執行一個忙循環 優點 避免了線程切換的開銷,掛起線程和恢復線程的操作都需要轉入內核態中完成,這些操作給Java虛擬機的并發性能帶來了很大的壓力 缺點 占用處理器的時間,如果占用的時間很長,會白白消耗處理器資源,而不會做任何有價值的工作,帶來性能的浪費 改進 自旋等待的時間必須有一定的限度,如果自旋超過了限定的次數仍然沒有成功獲得鎖,就應當使用傳統的方式去掛起線程 jvm調優 -XX:PreBlockSpin 設置固定失敗次數 自適應自旋 前一次在同一個鎖上的自旋時間及鎖的擁有者的狀態來決定的,通過系統監控進行調整
應用 synchronized、vector、hashtable 思想: 一種悲觀思想 ** ,即認為寫多讀少,遇到并發寫的可能性高 實現 每次讀寫數據都會認為其他線程會修改,所以每次讀寫數據時都會上鎖 缺點 他線程想要讀寫這個數據時,會被這個線程block,直到這個線程釋放鎖然后其他線程獲取到鎖
應用 synchronized、Reentrantlock、Lock 思想: 任意線程在獲取到鎖之后能夠再次獲取該鎖而不會被鎖所阻塞 實現 通過組合自定義同步器來實現鎖的獲取與釋放 獲取鎖:識別獲取鎖的線程是否為當前占據鎖的線程 ,如果是,則再次成功獲,。獲取鎖后,進行計數自增 釋放鎖:釋放鎖時,進行計數自減 優點: 避免死鎖 缺點 他線程想要讀寫這個數據時,會被這個線程block,直到這個線程釋放鎖然后其他線程獲取到鎖
應用 ReentrantReadWriteLock,CopyOnWriteArrayList、CopyOnWriteArraySet 思想 讀寫分離 實現 Java 提供了讀寫鎖,在讀的地方使用讀鎖,在寫的地方使用寫鎖 讀鎖: 允許多個線程獲取讀鎖,同時訪問同一個 寫鎖: 只允許一個線程獲取寫鎖,不允許同時訪問同一個資源 優點: 避免死鎖 缺點 他線程想要讀寫這個數據時,會被這個線程block,直到這個線程釋放鎖然后其他線程獲取到鎖
應用 Reentrantlock(true) 思想 多個線程按照申請鎖的順序來獲取鎖 實現 在并發環境中,每個線程會先查看此鎖維護的等待隊列,如果當前等待隊列為空,則占有鎖,如果等待隊列不為空,則加入到等待隊列的末尾, 按照FIFO的原則從 隊列中拿到線程,然后占有鎖
應用 synchronized、reentrantlock(false) 思想 線程嘗試獲取鎖,如果獲取不到,則再采用公平鎖的方式 實現 多個線程獲取鎖的順序,不是按照先到先得的順序,有可能后申請鎖的線程比先申請的線程優先獲取鎖
應用 ReentrantReadWriteLock中讀鎖 思想 可以有多個線程獲取讀鎖,以共享的方式持有鎖
應用 synchronized、vector、hashtable、ReentrantReadWriteLock中寫鎖 思想 是一種思想: 只能有一個線程獲取鎖,以獨占的方式持有鎖
應用 synchronized 思想 synchronized是通過對象內部的一個叫做監視器鎖(monitor)來實現的,監視器鎖本身依賴底層的操作系統的 Mutex Lock來實現。 缺點 操作系統實現線程的切換需要從用戶態切換到核心態,成本非常高。這種依賴于操作系統 Mutex Lock來實現的鎖稱為重量級鎖。 改進 為了優化synchonized,引入了輕量級鎖,偏向鎖。
應用 鎖優化技術 思想 輕量級鎖是在無競爭的情況下使用CAS操作去消除同步使用的互斥量。 輕量級是相對于使用操作系統互斥量來實現的重量級鎖而言的。 輕量級鎖在沒有多線程競爭的前提下,減少傳統的重量級鎖使用操作系統互斥量產生的性能消耗。 如果出現兩條以上的線程爭用同一個鎖的情況,那輕量級鎖將不會有效,必須膨脹為重量級鎖。 優點 如果沒有競爭,通過CAS操作成功避免了使用互斥量的開銷 缺點 如果存在競爭,除了互斥量本身的開銷外,還額外產生了CAS操作的開銷,因此在有競爭的情況下,輕量級鎖比傳統的重量級鎖更慢
“Java中各種鎖的介紹”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。