我對對象鎖定有困惑。 下面的類有4個方法,方法addB()是同步的。同步使對象鎖定
在我的書架中,有4個主題。當一個線程訪問addB()方法(它在Test對象上創建一個鎖)時,會有其他線程訪問addC()或addD()的時間嗎?
對象鎖一次只允許一個線程嗎?
class Test{
private Integer a;
private Integer b;
private Integer c;
private Integer d;
public void addA(){
synchronized(a) {
a++;
}
}
public synchronized void addB(){
b++;
}
public void addC(){
c++;
}
public void addD(){
d++;
}
}
編輯: 我有3個線程(T1,T2和T3),並且每一個將要訪問ADDB(),ADDC()和ADDD()。如果線程t1訪問方法addB(),是否可以同時線程t2訪問addC()方法?如果不是t2會是什麼狀態?
class Test{
private Integer a;
private Integer b;
private Integer c;
private Integer d;
public void addA(){
synchronized(a) {
a++;
}
}
public synchronized void addB(){
b++;
}
public synchronized void addC(){
c++;
}
public synchronized void addD(){
d++;
}
}
整數是不可改變的,它不會改變。當你做一個++時,它實際上會創建一個新的對象a。因此,你的鎖會變得混亂,因爲當a被刪除並且值被分配給新的a時,鎖將會丟失。這並不能真正幫助你解決問題,但可能會解決一個錯誤。你可以使用int而不是Integer。 – Mike 2010-06-23 18:26:30
@Mike - 漂亮。實際上,我認爲在這種特殊情況下,它不會導致錯誤,但如果他在他的'addA'實現中添加了任何代碼,則可能會很好。另外,他不能在'int'上同步,因爲它是一個原語,但他可以使用AtomicInteger。 – danben 2010-06-23 18:28:05
@danben謝謝。我不知道關於不在int上同步。我想我從來沒有嘗試過一種原始。你每天都會學到一些東西。 – Mike 2010-06-23 18:36:42