天天看點

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

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

·        對象鎖:Java的所有對象都含有1個互斥鎖,這個鎖由JVM自動擷取和釋放。線程進入synchronized方法的時候擷取該對象的鎖,當然如果已經有線程擷取了這個對象的鎖,那麼目前線程會等待;synchronized方法正常傳回或者抛異常而終止,JVM會自動釋放對象鎖。這裡也展現了用synchronized來加鎖的1個好處,方法抛異常的時候,鎖仍然可以由JVM來自動釋放。

·        類鎖:對象鎖是用來控制執行個體方法之間的同步,類鎖是用來控制靜态方法(或靜态變量互斥體)之間的同步。其實類鎖隻是一個概念上的東西,并不是真實存在的,它隻是用來幫助我們了解鎖定執行個體方法和靜态方法的差別的。我們都知道,java類可能會有很多個對象,但是隻有1個Class對象,也就是說類的不同執行個體之間共享該類的Class對象。Class對象其實也僅僅是1個java對象,隻不過有點特殊而已。由于每個java對象都有1個互斥鎖,而類的靜态方法是需要Class對象。是以所謂的類鎖,不過是Class對象的鎖而已。擷取類的Class對象有好幾種,最簡單的就是MyClass.class的方式。

·        類鎖和對象鎖不是同1個東西,一個是類的Class對象的鎖,一個是類的執行個體的鎖。也就是說:1個線程通路靜态synchronized的時候,允許另一個線程通路對象的執行個體synchronized方法。反過來也是成立的,因為他們需要的鎖是不同的。

類鎖,對象鎖,私有鎖

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

2.對象鎖:在代碼中的方法上加了synchronized的鎖,或者synchronized(this)的代碼段

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

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

舉例:ClassA a = new ClassA(); ClassA b = new ClassA(); 那麼如果你在a這對象上調用了methodA,不會影響b這個對象,也就是說對于b這個對象,他也可以調用methodA,因為這是兩對象,是以說對象鎖是針對對象的

類鎖,其實沒有所謂的類鎖,因為類鎖實際上就是這個類的對象的對象鎖

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