[英]What is the use of static synchronized method in java?
我心中有一個問題。 我已經讀過靜態同步方法鎖定在類對象中,同步方法鎖定對象的當前實例。 那么locked on class object是什么意思呢?
任何人都可以幫我解決這個話題嗎?
通常, synchronized
方法用於保護對並發訪問的資源的訪問。 當被並發訪問的資源屬於類的每個實例時,您使用synchronized
實例方法; 當資源屬於所有實例時(即當它在static
變量中時),則使用synchronized static
方法來訪問它。
例如,您可以創建一個static
工廠方法,該方法保留它生成的所有對象的“注冊表”。 此類注冊表的自然位置將是static
集合。 如果您的工廠被多個線程使用,您需要使工廠方法synchronized
(或在方法內部有一個synchronized
塊)以保護對共享static
集合的訪問。
請注意,在構建要在其他人編寫的代碼中使用的庫時,使用沒有特定鎖對象的synchronized
通常不是最安全的選擇。 這是因為惡意代碼可能會在您的對象或類上同步以阻止您自己的方法執行。 為了保護您的代碼不受此影響,請創建一個私有的“鎖定”對象、實例或靜態,然后在該對象上進行同步。
在運行時,每個加載的類都有一個Class
對象的實例。 即static synchronized
方法用作共享鎖對象的對象。 (任何同步方法或塊都必須鎖定某個共享對象。)
如果需要,您還可以手動同步此對象(無論是否在靜態方法中)。 這三種方法的行為相同,一次只允許一個線程進入內部塊:
class Foo {
static synchronized void methodA() {
// ...
}
static void methodB() {
synchronized (Foo.class) {
// ...
}
}
static void methodC() {
Object lock = Foo.class;
synchronized (lock) {
// ...
}
}
}
static synchronized
方法的預期目的是當您希望一次只允許一個線程使用存儲在類的static
變量中的某些可變狀態時。
如今,Java 在java.util.concurrent
及其子包java.util.concurrent
具有更強大的並發功能,但核心 Java 1.0 構造(例如synchronized
方法)仍然有效和可用。
簡單來說, static synchronized
方法將鎖定類而不是對象,並且它將鎖定類,因為關鍵字static
意思是:“類而不是實例”。
關鍵字synchronized
意味着一次只有一個線程可以訪問該方法。
而static synchronized
意思是:
一次只有一個線程可以訪問該類。
假設一個類中有多個靜態同步方法(m1、m2、m3、m4),並且假設一個線程正在訪問m1,那么同時沒有其他線程可以訪問任何其他靜態同步方法。
靜態方法可以同步。 但是每個班級都有一個鎖。 當加載 java 類時,相應的 java.lang.class 類對象就在那里。 .static 同步方法需要該對象的鎖。 因此,當您有一個靜態字段應該被限制為一次被多個線程訪問時,您可以將這些字段設置為私有並創建公共靜態同步 setter 或 getter 來訪問這些字段。
Java VM 每個類包含一個類對象。 每個類可能有一些稱為靜態變量的共享變量。 如果代碼的關鍵部分在並發環境中使用這些變量,那么我們需要使該特定部分同步。 當有多個靜態同步方法時,一次只會執行其中一個方法而不會被搶占。 這就是鎖定類對象的作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.