[英]Intrinsic Locks and Synchronization
我目前在oracle.com上閱讀有關內部鎖定和同步的內容,在這里我來到這個特定的例子:
同步語句對於通過細粒度同步提高並發性也很有用。 例如,假設類MsLunch有兩個從不一起使用的實例字段
c1
和c2
。 必須同步這些字段的所有更新,但沒有理由阻止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
是鎖定供應商? 或者換句話說:這會導致問題嗎?
這里有兩個鎖,只是為了有可能獨立增加c1
和c2
而不是在釋放鎖時等待。 因此,如果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.