簡體   English   中英

Java中類鎖定和對象鎖定的區別

[英]Difference between class locking and object locking in Java

人們講述了兩種類型的多線程鎖定 - 對象和類。 據我所知,鎖定僅在對象上完成。

案例1:使用new方法或工廠方法等創建的對象

void synchronized myMethod(Type param) {
  //will lock on the instance used to call this method
}

要么

synchronized(this) {
 //will lock on current object
}

要么

synchronized(obj1) {
 //will lock on specified obj1 object
}

案例2:關於java.lang.Class對象

這稱為類鎖,可以與靜態字段或方法或塊一起使用,因為它們屬於類並在所有對象和其他類屬性之間共享。

static void synchronized method() {
  //will lock the Class object
}

要么

static {
  synchronized(SomeClass.class){
    int a = 2;
  }
}
  • 為什么我還將此視為對象鎖定,因為類被加載到JVM中的方法區域,並且類的所有靜態屬性都包裝在由JVM創建的java.lang.Class對象中 因此抽象,它的對象鎖定和圖片中,我們看到類鎖定。
  • 所以我還可以推斷出一件事。 正如一個線程鎖定的對象不能被另一個線程獲取,只要它不被第一個線程釋放,類鎖定( java.lang.Class實例)也以相同的方式工作。
  • 我想知道在同步靜態方法的情況下,在以下兩種情況下鎖定線程獲取哪個類:

    1. 從定義它的同一個類調用此方法。
    2. 從具有派生類名的派生類調用此方法。

到目前為止,這是我對這個問題的理解。 請加上或糾正。

人們講述了兩種類型的多線程鎖定 - 對象和類。

一個對象。 Java 語言中只有一種鎖定:每個對象(包括每個類)都有一個可以通過synchronized塊或synchronized方法鎖定的互斥鎖。 要鎖定的Object隱含在synchronized方法中:它是實例方法的“this”實例,它是靜態方法的Class對象。

最常見的新手錯誤之一是認為兩個不同的線程無法同時進入同一個synchronized塊。 他們可以 ,並且StackOverflow中有很多問題和答案可以證明這一點。 另一個錯誤是認為如果一個線程在某個對象上同步,那么其他線程將無法修改該對象。 他們可以和他們一樣。

同步可防止兩個或多個線程同時在同一個Object上進行同步。 哪個對象是正確的對象? 這一切都與保護您的數據有關。 例如,如果要保護的結構是鏈接列表,則可以選擇訪問列表以在列表標題上進行同步的任何方法。 如果要保護全局數據(例如, static變量),則需要在全局對象上進行同步(例如,擁有變量的Class對象。)重要的是,如果您有讀/寫數據(又名) ,“可變數據”),由多個線程訪問,然后訪問相同數據的每個方法必須在同一個鎖上同步。


Java中有另一種鎖定,但它不是Java 語言 ; 它在Java標准庫中。 它可以通過實現java.util.concurrent.locks.Lock接口的對象獲得。 當然,一個鎖定對象(像任何對象)也實現了第一類鎖定的,但你應該永遠, 永遠 ,一個鎖對象上,除非你想給人們的印象是,你是一個無能的新手同步。

java.util.concurrent樣式的鎖定比使用synchronized塊更強大,因為它是顯式的lock()和unlock()方法。 例如,一種方法可以鎖定鎖,而另一種方法可以解鎖。 這可能導致代碼難以理解,除非我有充分的理由,否則我不會這樣做,但有時候有充分的理由。

唯一的區別是類實例上的static synchronized鎖和非靜態synchronized方法鎖定實例。

人們講述了兩種類型的多線程鎖定

有對象實例鎖和Lock樣式鎖。 一個令人困惑的Lock ,兩者都有。

對象和類

不正確,因為你已經解決了。

僅僅因為人們說東西不能成真。 人們經常說很多廢話。 事實上,整個網站致力於無意義的Java。 :P

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM