[英]What's the usage of synchronized in Java?
我已經寫了幾年的C ++。 並開始用Java編寫。 Java中有同步語句。 這對我來說是新手,我發現了以下用法:
synchronized (NetworkManager.class) {/*some code*/}
和
NetworkManager myInstance = new NetworkManager();
synchronized(myInstance){/*some code*/}
我知道同步語句將阻止其他同步訪問對象中的同步部分。 但是我對同步的說法感到困惑。
我的想法是,如果我想阻止某些方法,那么在第二個示例中,我應該在C ++中的myInstance上進行同步。 如果我創建另一個實例,它應該沒有影響。 這個對嗎?
如果正確,那么使用NetworkManager.class
會發生什么? .class將返回對NetworkManager
的類對象引用。 它會在哪些情況下生效? 還是會影響所有NetworkManager
實例?
synchronized (NetworkManager.class) {//some code}
將獲得對NetworkManager
類的Class object
的鎖定。 如果您在訪問同一類對象(Networkmanager.class)時進行了同步,則這將阻止同時訪問Networkmanager
類的static fields and methods
方法。 要么
NetworkManager myInstance = new NetworkManager();
synchronized(myInstance){//some code}
在以上兩行中,您正在鎖定NetworkManager類的特定實例(而不是類本身)。
使用synchronized (object)
,當前Thread
將獲得所提供對象的監視器鎖定(並在退出塊或等待對象時釋放它)。 如果監視器鎖已由其他線程持有,則該線程將排隊等待該鎖,並等待其變為可用狀態。 換句話說,使用同步提供了object
作為互斥體的獨占訪問。 請注意,使用同步還提供了某些內存可見性保證。
使用synchronized (myInstance)
您將鎖定提供的實例。 使用相同實例的所有同步塊以及該實例的synchronized
實例方法將使用相同的互斥量。
當您使用synchronized (NetworkManager.class)
你鎖定的Class
的實例NetworkManager
。 使用NetworkManager.class
所有同步塊(假設它們都來自同一ClassLoader
)和NetworkManager
static synchronized
方法將使用相同的互斥量。
因此,使用synchronized (NetworkManager.class)
不會鎖定所有實例。 鎖在實例或Class
對象上的唯一真正區別在於,前者包括針對實例的同步方法的鎖定,而后者包括針對類的同步靜態方法的鎖定; 在所有其他方式下,它們的工作原理相同:您鎖定提供的對象。
您可能還想閱讀Java Concurrency教程 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.