簡體   English   中英

內在鎖定和同步

[英]Intrinsic Locks and Synchronization

我目前在oracle.com上閱讀有關內部鎖定和同步的內容,在這里我來到這個特定的例子:

同步語句對於通過細粒度同步提高並發性也很有用。 例如,假設類MsLunch有兩個從不一起使用的實例字段c1c2 必須同步這些字段的所有更新,但沒有理由阻止c1的更新與c2的更新交錯 - 這樣做會通過創建不必要的阻塞來減少並發性。 我們創建兩個對象僅用於提供鎖,而不是使用同步方法或以其他方式使用與此關聯的鎖。

public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();

    public void inc1() {
        synchronized(lock1) {
            c1++;
        }
    }

    public void inc2() {
        synchronized(lock2) {
            c2++;
        }
    }
}

在本節之前, synchronized方法解釋如下:

public synchronized void increment() {
    this.c++;
}

應該是哪個,請糾正我,如果我錯了,就像

public void increment() {
    synchronized(this) {
        c++;
    }
}

如果我沒有為increment()添加功能,那是正確的嗎?

我現在的問題來自這句話:

但是沒有理由阻止c1的更新與c2的更新交錯

我不確定我是否完全理解“ 交錯 ”在這種情況下的含義。 這是否意味着,如果我從MsLunch示例中刪除lock2

public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    // private Object lock2 = new Object(); // 'lock2' is no more!

    public void inc1() {
        synchronized(lock1) {
            c1++;
        }
    }

    public void inc2() {
        synchronized(lock1) { // Using 'lock1' here too
            c2++;
        }
    }
}

我可能遇到鎖定問題? 假設thread-1運行到inc1() ,從lock1獲取鎖,但在能夠增加或釋放鎖之前被掛起。 現在thread-2正在輸入inc2() ,其中為lock1創建了另一個鎖。 這是正在使用另一種避免什么lock2 ,這就是為什么我不會簡單地使用的原因this是鎖定供應商? 或者換句話說:這會導致問題嗎?

這里有兩個鎖,只是為了有可能獨立增加c1c2而不是在釋放鎖時等待。 因此,如果Thread-1進入c1同步塊並獲取lock1 ,則另一個Thread-2將能夠在不等待thread-1釋放鎖定時增加c2


重要提示:

使用this作為共享顯示器有自己的問題,因為上的實例的引用MsLunch是外部可見MsLunch 例如。 Thread-3能夠在synchronized (msLunchInstance)之外獲取: synchronized (msLunchInstance)的鎖。

暫無
暫無

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

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