1. 程式人生 > >Java鎖機制總結

Java鎖機制總結

擴展 內置 內置鎖 包括 功能 共享變量 操作 sync 第一個

鎖是用於控制多線程對共享資源的訪問。 Java中的鎖可以分為內置鎖與顯式鎖Lock。其中內置鎖指synchronized關鍵字。

Synchronized

  synchronized可以修飾方法或代碼塊(在修飾代碼塊時,會在編譯後在代碼塊前後加入monitorenter和monitorexit指令,修飾方法時會在方法上加入ACC_SYNCHRONIZED訪問標誌),在修飾靜態方法時獲取到的是類鎖,否則是對象鎖。線程在訪問方法或代碼塊時,必須先獲得鎖,否則會進入阻塞狀態。

  synchronized在JDK 6進行了優化,每個對象有 無鎖、偏向鎖、輕量級鎖和重量級鎖四種狀態,存在於對象頭中。偏向鎖指認為多數情況下不存在多線程競爭,對於第一個線程不需要獲得鎖;輕量級鎖是在偏向鎖被兩個線程訪問時,線程通過CAS和自旋的方式獲得鎖,不會發生阻塞。當有多個線程同時訪問鎖時,升級為重量級鎖,一個線程獲得鎖,其他線程被阻塞。

Lock

  Lock提供了擴展功能。ReentrantLock實現了Lock接口,它有可中斷、可輪詢,可以設置公平鎖或非公平鎖。它繼承了AQS這個基類,其中核心的兩個方法是tryAcquire和tryRelease,它使用CAS操作來獲取鎖與釋放鎖。其他的顯式鎖還包括Semaphore、CountDownLatch等,他們都繼承了AQS,其中Semaphore信號量可以使多個線程訪問共享變量,CountDownLatch可以使主線程等待所有線程運行完後再繼續向下執行。

Java鎖機制總結