簡體   English   中英

Java線程鎖定靜態方法

[英]Java Thread lock on static method

據我對Java類的了解

  1. 非靜態同步方法:在特定對象上鎖定獲取
  2. 靜態同步方法:在類上獲取鎖

我對此有點困惑,因為我們可以按類名或對象名調用靜態方法。

請假設有4種方法是我的課全部同步。 2個方法是靜態的,而2個是非靜態的 如果我將創建我的類“ obj1”的1個對象,並且還有2個線程Thread1和Thread2

問題1:如果我嘗試使用obj1(或類名)訪問靜態同步方法。 這是否意味着“ obj1”上沒有鎖,只有2個靜態方法將被鎖(類級別鎖)? 意味着其他線程可以同時使用“ obj1”訪問非靜態方法,但不能訪問靜態方法?

問題2:如果我嘗試使用Thread1中的obj1訪問非靜態同步方法。 這是否意味着Thread2僅鎖定了2個方法? 表示Thread2可以訪問2個靜態方法,或者我們也可以同時使用className(MyClass)訪問該靜態方法

問題3:如果我班上的所有方法都是靜態的並且是同步的。 這是否意味着將沒有對象級別鎖,並且所有線程只有一個類級別鎖。

請解釋一下有關類級別鎖的一些信息

提前致謝。

即使您使用調用靜態方法

someObject.staticMethod()

它不會改變鎖在Class對象上的事實。 這只是意味着您正在以一種令人困惑的方式調用靜態方法,因此您應該正確地調用它。 僅僅因為它工作得很好,並不意味着應該使用它(除非您打算使代碼的可讀性降低)。

類級別鎖沒有什么特別的。 它僅使用Class對象而不是實例,並且由於所有靜態同步都使用相同的Class對象,因此它的工作原理與原來相同。

至於最后一個問題,是的。 如果只有靜態同步方法,則無論創建了多少個類實例,它們都將共享Class對象作為其鎖。

暫無
暫無

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

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