對象鎖和類鎖是否會互相影響?


  • 對象鎖

  在代碼中的方法上加了synchronized的鎖,或者synchronized(this)的代碼段。

  Java的所有對象都含有一個互斥鎖,這個鎖由jvm自動獲取和釋放。線程進入synchronized方法的時候獲取該對象的鎖,但如果已經有線程獲取了這個對象的鎖,那么當前線程會等待;synchronized方法正常返回或者拋異常而終止,jvm會自動釋放對象鎖。這里也體現了用synchronized來加鎖的一個好處,方漢拋異常的時候,鎖仍然可以由jvm來自動釋放。

  假設我有一個類ClassA,其中有一個方法synchronized methodA(),那么當這個方法被調用的時候,我們獲得就是對象鎖。

    • 舉例:

    ClassA a = new ClassA();

    ClassA b = new ClassA();

    那么如果在a這對象上調用了methodA,不會影響b這個對象,也就是說對於b這個對象,他也可以調用methodA,因為這是兩個不同的對象,所以說對象鎖是針對對象的。

  • 類鎖

  在代碼中的方法上加了static和synchronized的鎖,或者synchronized(xxx.class)的代碼段;

  對象鎖是用來控制實例方法之間的同步,類鎖是用來控制靜態方法(或靜態變量互斥體)之間的同步。其實類鎖只是一個概念上的東西,並不是真實存在的,它只是用來幫助我們理解鎖定實例方法和靜態方法的區別的。我們知道,java類可能會有很多個對象,但是只有一個Class對象,也就是說類的不同實例之間共享該類的Class對象。Class對象其實也僅僅是一個java對象。所以所謂的類鎖,不過是Class對象的鎖而已。獲取類的Class對象有好幾種,最簡單的就是MyClass.class的方式。

  例如有一個類ClassA,其中有一個方法synchronized static methodA(),注意這個方法是靜態的,那就是說這個類的所有對象都公用這個方法,那如果在這個類的某個對象上調用了這個方法,那么其他的對象如果想要用這個方法就得待着鎖被釋放,所以感覺就好像這個類被鎖住了一樣。

  • 私有鎖

  在類內部聲明一個私有屬性,如private Object lock,在需要加鎖的代碼段synchronized(lock)。

  • 類鎖和對象鎖不是同一個東西

  一個是類的Class對象的鎖,一個是類的實例的鎖。也就是說:一個線程訪問靜態synchronized的時候,允許另一個線程訪問對象的實例synchronized方法。反過來也是成立的,因為他們需要的鎖是不同的,因此類鎖和對象鎖不會產生競爭,二者的加鎖方法不會相互影響


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM