[英]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;
}
}
java.lang.Class
對象中 。 因此抽象,它的對象鎖定和圖片中,我們看到類鎖定。 java.lang.Class
實例)也以相同的方式工作。 我想知道在同步靜態方法的情況下,在以下兩種情況下鎖定線程獲取哪個類:
到目前為止,這是我對這個問題的理解。 請加上或糾正。
人們講述了兩種類型的多線程鎖定 - 對象和類。
類是一個對象。 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.