예제에서 methodA와 methodB는 인스턴스 메소드입니다 (정적 메소드와 반대). 퍼팅 synchronized
스레드가 상기 방법은 스레드가 그 방법에서 코드를 실행을 시작하기 전에 호출되는 오브젝트 인스턴스에 대한 잠금 (이하 "극한 로크")를 획득한다는 것을 인스턴스 메소드 수단에.
동기화 된 것으로 표시된 두 개의 다른 인스턴스 메소드가 있고 다른 스레드가 동일한 오브젝트에서 해당 메소드를 동시에 호출하는 경우 해당 스레드는 동일한 잠금을 위해 경합합니다. 한 스레드가 잠금을 획득하면 다른 모든 스레드는 해당 오브젝트의 모든 동기화 된 인스턴스 메소드에서 종료됩니다.
두 방법을 동시에 실행하려면 다음과 같이 다른 잠금을 사용해야합니다.
class A {
private final Object lockA = new Object();
private final Object lockB = new Object();
public void methodA() {
synchronized(lockA) {
//method A
}
}
public void methodB() {
synchronized(lockB) {
//method B
}
}
}
여기서 동기화 된 블록 구문은 실행 스레드가 블록에 들어가기 위해 본질적 잠금을 획득해야하는 특정 객체를 지정할 수있게합니다.
이해해야 할 중요한 점은 개별 메소드에 "동기화 된"키워드를 사용하더라도 핵심 개념은 장면 뒤의 본질적인 잠금입니다.
다음은 Java 학습서 가 관계를 설명하는 방법입니다 .
동기화는 내장 잠금 또는 모니터 잠금이라고하는 내부 엔터티를 기반으로합니다. (API 사양은 종종이 엔티티를 단순히 "모니터"라고합니다.) 내장 잠금은 동기화의 두 측면에서 중요한 역할을합니다. 즉 객체 상태에 대한 독점 액세스를 강화하고 가시성에 필수적인 관계를 설정합니다.
모든 객체에는 관련된 고유 잠금이 있습니다. 일반적으로 객체 필드에 독점적이고 일관된 액세스가 필요한 스레드는 객체에 액세스하기 전에 객체의 본질적 잠금을 획득 한 다음 완료되면 본질적 잠금을 해제해야합니다. 스레드는 잠금을 획득하고 잠금을 해제 한 시간 사이에 고유 잠금을 소유한다고합니다. 스레드가 내장 잠금을 소유하는 한 다른 스레드는 동일한 잠금을 얻을 수 없습니다. 다른 스레드는 잠금을 획득하려고 시도 할 때 차단됩니다.
잠금의 목적은 공유 데이터를 보호하는 것입니다. 위의 예제 코드에 표시된대로 각 잠금이 서로 다른 데이터 멤버를 보호하는 경우에만 별도의 잠금을 사용합니다.