JavaRush /Java Blog /Random-TW /線程同步、物件鎖定和類別鎖定
CynepHy6
等級 34
Великий Новгород

線程同步、物件鎖定和類別鎖定

在 Random-TW 群組發布
線程同步、物件鎖定和類別鎖定 - 1同步是指多執行緒。同步程式碼區塊一次只能由一個執行緒執行。 Java支援多執行緒執行。這可能會導致兩個或多個執行緒存取相同欄位或物件。同步是一個允許程式中所有並行執行緒同步運行的過程。同步可以避免由於對共享記憶體的存取不一致而導致的記憶體一致性錯誤。當一個方法被宣告為同步時,執行緒會持有一個正在執行其方法的物件的監視器。如果另一個執行緒正在執行同步方法,您的執行緒將會阻塞,直到另一個執行緒釋放監視器。Java 中的同步是透過保留字來實現的synchronized您可以透過定義同步方法或區塊在類別中使用它。您將無法synchronized在類別定義中使用變數或屬性。

物件級鎖定

這是一種同步非靜態方法或非靜態程式碼區塊的機制,以便只有一個執行緒可以在給定的類別實例上執行給定的區塊或方法。每當您需要確保實例級資料線程安全時都應該執行此操作。例子:
public class DemoClass{
    public synchronized void demoMethod(){}
}
或者
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
或者
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

類別級鎖定

防止多個執行緒在該類別的任何可用執行個體中執行期間進入同步區塊。這意味著,如果程式執行期間​​有 100 個該類別的實例DemoClass,那麼此時只有一個執行緒能夠demoMethod()在任何一種情況下執行,而所有其他情況都將被其他執行緒阻塞。當您需要使靜態資料線程安全時,這是必要的。
public class DemoClass{
    public synchronized static void demoMethod(){}
}
或者
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
或者
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

一些重要的注意事項

  1. Java 中的同步確保沒有兩個執行緒可以同時或並行執行同步方法。

  2. synchronized只能與方法和程式碼區塊一起使用。這些方法或區塊可以是靜態的或非靜態的。

  3. 每當任何執行緒進入同步方法或區塊時,它都會取得鎖,每當執行緒退出同步方法或區塊時,JVM 都會釋放鎖。即使在完成後執行緒因任何錯誤或異常而離開同步方法,鎖也會被釋放。

  4. synchronized在Java中這表示如果一個同步方法呼叫另一個需要相同鎖的同步方法,目前持有該鎖的執行緒可以進入該方法而無需取得鎖。

  5. Синхронизация в Java будет бросать NullPointerException если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется How null, синхронизированный (lock) бросит NullPointerException.

  6. Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.

  7. Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.

  8. В соответствии со спецификацией языка вы не можете использовать synchronized в конструкторе это приведет к ошибке компиляции.

  9. Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс String, который уже неизменяемый и финальный.

Удачи в обучении!! Оригинал: Object level lock vs Class level lock in Java
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION