簡體   English   中英

Java中sync的用途是什么?

[英]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.

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