簡體   English   中英

當使用synced(lock)時,鎖定對象是靜態的還是非靜態的?

[英]When using synchronized(lock), the lock object is prefered to be static or non-static?

當使用這樣的東西:

private final Object lock = new Object()

靜態和非靜態之間有什么區別嗎?

非靜態對象可以鎖定靜態方法嗎?反之亦然?

如果您使用的是非靜態鎖,則該對象的每個實例都將具有一個不同的鎖對象,並且這可能是調用的一種更細粒度的等效方法:

synchronized(this) {

}

就是說:您只鎖定來自同一對象內的其他訪問。 使用靜態鎖,該類的每個實例都共享該鎖對象。 因此,在任何給定時間,只有一個線程可以訪問同步塊。

因此,這取決於您在做什么。 在前一種情況下,麻煩分配一個鎖對象是沒有意義的,除非您擁有多個這些鎖來保護較小的數據子集。 在后一種情況下,您基本上(再次是更細粒度的)這樣做:

synchronized(MyObject.class) {

}

也就是說,無論您具有相同的對象還是進行訪問的對象不同,您都將禁止所有訪問。

這將取決於您要完成的工作,鎖定的內容以及如何使用這些鎖定。 如果要保護每個實例的狀態,則可能需要一個每個實例(非靜態)的鎖定對象。 如果要保護全局狀態,則需要一個在所有人之間共享的靜態鎖對象。

與往常一樣,這取決於情況。 您想做什么? 如果應該全局共享鎖,則它應該是靜態的。 如果您要同步的對象是非靜態的,則可能不應該使用靜態鎖定對象,因為那樣會阻止同時訪問單獨的實體。

最大的不同是,鎖定非靜態對象意味着您可能要鎖定兩個不同的對象,因此不會提供任何互斥。 如果僅在對象級別需要提供互斥,那么這可能就是您想要的。 (實際上,這是在同步(非靜態)方法時發生的事情:您正在this進行同步,這絕對不是靜態對象。)

暫無
暫無

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

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