程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java多線程同步如何從JVM的角度體會

Java多線程同步如何從JVM的角度體會

編輯:關於JAVA

 我們在使用Java多線程同步的時候需要了解很多的知識,其中Java多線程同步機制實際上是靠鎖的概念來控制的。這個問題就需要我們引起注意,那麼在Java程序當中,鎖是如何體現的呢?

  讓我們從JVM的角度來看看鎖這個概念:

  在Java程序運行時環境中,JVM需要對兩類線程共享的數據進行協調:

  1)保存在堆中的實例變量

  2)保存在方法區中的類變量

  這兩類數據是被所有線程共享的。(程序不需要協調保存在Java 棧當中的數據。因為這些數據是屬於擁有該棧的線程所私有的。)

  在Java虛擬機中,每個對象和類在邏輯上都是和一個監視器相關聯的。對於對象來說,相關聯的監視器保護對象的實例變量。對於類來說,監視器保護類的類變量。

  (如果一個對象沒有實例變量,或者一個類沒有變量,相關聯的監視器就什麼也不監視。)

  為了實現監視器的排他性監視能力,Java多線程同步虛擬機為每一個對象和類都關聯一個鎖。代表任何時候只允許一個線程擁有的特權。線程訪問實例變量或者類變量不需鎖。但是如果線程獲取了鎖,那麼在它釋放這個鎖之前,就沒有其他線程可以獲取同樣數據的鎖了。(鎖住一個對象就是獲取對象相關聯的監視器)

  類鎖實際上用對象鎖來實現。當虛擬機裝載一個class文件的時候,它就會創建一個Java.lang.Class類的實例。當鎖住一個對象的時候,實際上鎖住的是那個類的Class對象。

  一個線程可以多次對同一個對象上鎖。對於每一個對象,Java虛擬機維護一個加鎖計數器,線程每獲得一次該對象,計數器就加1,每釋放一次,計數器就減 1,當計數器值為0時,鎖就被完全釋放了。

  java多線程同步不需要自己動手加鎖,對象鎖是java虛擬機內部使用的。在java程序中,只需要使用synchronized塊或者 synchronized方法就可以標志一個監視區域。當每次進入一個監視區域時,Java 虛擬機都會自動鎖上對象或者類。

  看到這裡,我想你們一定都疲勞了吧?當一個有限的資源被多個線程共享的時候,為了保證對共享資源的互斥訪問,我們一定要給他們排出一個先來後到。而要做到這一點,對象鎖在這裡起著非常重要的作用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved