객체 잠금에 혼란이 있습니다. 아래의 클래스는 4 개의 메소드를 가지고 있으며 addB() 메소드는 동기화되어 있습니다.동기화가 객체 잠금을 만듭니다.
내 Scienario에는 4 개의 스레드가 있습니다. 스레드 2가 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++;
}
}
EDIT : I 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에 할당되면 잠금이 손실되기 때문입니다. 이것은 당신의 문제에 도움이되지는 않지만 길 아래의 오류를 해결할 수 있습니다. Integer 대신 int를 사용할 수 있습니다. – Mike
@Mike - 멋진 잡기. 사실,이 특별한 경우에는 오류를 일으킬 수 없다고 생각하지만, 그의 코드가'addA' 구현체에 추가된다면 매우 좋을 것입니다. 또한'int '는 원시적이기 때문에 동기화 할 수 없지만'AtomicInteger'를 사용할 수 있습니다. – danben
@ 단벤 감사합니다. 나는 int 상에 동기화하지 않는다는 것을 몰랐다. 나는 원시적 인 것을 결코 시도한 적이 없다고 생각한다. 당신은 매일 무언가를 배웁니다. – Mike