Java Synchronized

Java Synchronized編程

1 引言

在多線程併發編程中Synchronized一直是元老級角色,不少人都會稱呼它爲重量級鎖,可是隨着Java SE1.6對synchronized進行了各類優化以後,有些狀況下它並不那麼重了,Java SE1.6中爲了減小得到鎖和釋放鎖帶來的性能消耗而引入的偏向鎖和輕量級鎖。多線程

 

2 術語定義

術語 英文 說明
CAS Compare and Swap

比較並設置。用於在硬件層面上提供原子性操做。在 Intel 處理器中,併發

比較並交換經過指令cmpxchg實現。比較是否和給定的數值一致,若是一致則修改,不一致則不修改。性能

 

3 同步的基礎

Java中的每個對象均可以做爲鎖。優化

對於同步方法,鎖是當前實例對象。spa

對於靜態同步方法,鎖是當前對象的Class對象。線程

對於同步方法塊,鎖是synchonized括號裏配置的對象。對象

當一個線程試圖訪問同步代碼塊時,它首先必須獲得鎖,退出或拋出異常時必須釋放鎖。同步

 

4 同步的原理

JVM規範規定JVM基於進入和退出Monitor對象來實現方法同步和代碼塊同步,但二者的實現細節不同。代碼塊同步是使用monitorenter和monitorexit指令實現,而方法同步是使用另一種方式實現的,細節在JVM規範裏並無詳細說明,可是方法的同步一樣可使用這兩個指令來實現。monitorenter指令是在編譯後插入到同步代碼塊的開始位置,而monitorexit是插入到方法結束處和異常處, JVM要保證每一個monitorenter必須有對應的monitorexit與之配對。任何對象都有一個 monitor 與之關聯,當且一個monitor 被持有後,它將處於鎖定狀態。線程執行到 monitorenter 指令時,將會嘗試獲取對象所對應的 monitor 的全部權,即嘗試得到對象的鎖。it

===========END===========

相關文章
相關標籤/搜索