我們在使用Java多線程同步的時候需要了解很多的知識其中Java多線程同步機制實際上是靠鎖的概念來控制的這個問題就需要我們引起注意那麼在Java程序當中鎖是如何體現的呢?
讓我們從JVM的角度來看看鎖這個概念
在Java程序運行時環境中JVM需要對兩類線程共享的數據進行協調
)保存在堆中的實例變量
)保存在方法區中的類變量
這兩類數據是被所有線程共享的(程序不需要協調保存在Java 棧當中的數據因為這些數據是屬於擁有該棧的線程所私有的)
在java虛擬機中每個對象和類在邏輯上都是和一個監視器相關聯的對於對象來說相關聯的監視器保護對象的實例變量對於類來說監視器保護類的類變量
(如果一個對象沒有實例變量或者一個類沒有變量相關聯的監視器就什麼也不監視)
為了實現監視器的排他性監視能力java多線程同步虛擬機為每一個對象和類都關聯一個鎖代表任何時候只允許一個線程擁有的特權線程訪問實例變量或者類變量不需鎖但是如果線程獲取了鎖那麼在它釋放這個鎖之前就沒有其他線程可以獲取同樣數據的鎖了(鎖住一個對象就是獲取對象相關聯的監視器)
類鎖實際上用對象鎖來實現當虛擬機裝載一個class文件的時候它就會創建一個javalangClass類的實例當鎖住一個對象的時候實際上鎖住的是那個類的Class對象
一個線程可以多次對同一個對象上鎖對於每一個對象java虛擬機維護一個加鎖計數器線程每獲得一次該對象計數器就加每釋放一次計數器就減 當計數器值為時鎖就被完全釋放了
java多線程同步不需要自己動手加鎖對象鎖是java虛擬機內部使用的在java程序中只需要使用synchronized塊或者synchronized方法就可以標志一個監視區域當每次進入一個監視區域時java 虛擬機都會自動鎖上對象或者類
看到這裡我想你們一定都疲勞了吧?當一個有限的資源被多個線程共享的時候為了保證對共享資源的互斥訪問我們一定要給他們排出一個先來後到而要做到這一點對象鎖在這裡起著非常重要的作用
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27297.html