Java에서 동기화 키워드를 사용하는 방법을 간단히 기록해 보세요.
소개하기 전에 Java 클래스의 각 객체 인스턴스에는 이와 관련된 잠금(잠금)이 하나만 있고 이 잠금에만 작동한다는 점을 명확히 할 필요가 있습니다. Java 클래스 효과의 객체 인스턴스에 영향을 미칩니다.
동기화된 수정 기능
다음과 같이 코드 코드를 복사합니다.
공개 동기화 aMethod(){
}
이것이 가장 일반적으로 사용되는 시나리오인데, 이 동기화 방법의 목적은 무엇입니까? 편의상 aMethod 방법이라고 합니다.
1. 동기화된 잠금이란 이 동기화 메서드를 호출하는 개체 인스턴스입니다. 예를 들어 동일한 인스턴스 P1이 다른 스레드에서 aMethod를 호출하면 동기화가 발생합니다.
2. 이 객체가 속한 클래스의 다른 객체 P2는 이 aMethod를 임의로 호출할 수 있다는 점에 유의해야 합니다. 왜냐하면 서로 다른 객체 인스턴스의 동기화된 메서드는 서로 간섭하지 않기 때문입니다. 즉, 다른 스레드는 동일한 클래스의 다른 객체 인스턴스에 있는 aMethod 메서드에 동시에 액세스할 수 있습니다.
3. 객체에 aMethod, bMethod 및 cMethod와 같은 여러 동기화된 메서드가 있는 경우 이제 한 스레드가 동기화된 메서드 중 하나에 액세스하는 한 다른 스레드는 동시에 개체의 동기화된 메서드에 액세스할 수 없습니다.
위의 코드는 실제로 다음과 동일합니다.
다음과 같이 코드 코드를 복사합니다.
공공 무효 aMethod() {
동기화됨 (이것) {
}
}
여기서는 P1과 같은 인스턴스 개체의 참조를 나타냅니다. 동기화 방법의 본질은 개체 참조에 동기화를 적용하는 것임을 알 수 있습니다. P1 개체 잠금을 획득한 스레드만 P1의 동기화 메서드를 호출할 수 있으며, P1 잠금은 이와 관련이 없습니다. 상황이 발생하여 데이터 혼란이 발생합니다. 이것으로부터 우리는 아래의 동기화 블록을 도출합니다.
동기화된 수정 코드 블록
다음과 같이 코드 코드를 복사합니다.
공공 무효 dMethod(SomeObject 그래서) {
동기화됨(그래서) {
}
}
여기에서 동기화를 통해 얻은 잠금은 so 개체의 잠금이므로 잠금을 얻은 사람은 누구나 자신이 제어하는 코드를 실행할 수 있습니다. 잠금으로 사용할 클리어 객체가 있는 경우에는 다음과 같이 프로그램을 작성할 수 있지만 잠금으로 사용할 클리어 객체가 없고 코드 조각만 동기화하려는 경우에는 특수 인스턴스 변수를 생성할 수 있습니다(반드시 객체) 잠금 역할을 합니다.
다음과 같이 코드 코드를 복사합니다.
Foo 클래스는 Runnable을 구현합니다.
개인 바이트[] 잠금 = 새 바이트[0];
공개 무효 메소드() {
동기화(잠금) {
}
}
}
길이가 0인 바이트 배열 개체는 다른 개체보다 생성하는 것이 더 비용 효율적입니다.
동기화되고 수정된 정적 메서드
앞서 언급했듯이, 동기화된 키워드는 서로 다른 스레드의 P1 인스턴스에만 유효합니다. 그렇다면 어떻게 P1과 P2의 서로 다른 인스턴스에 대해 동시에 유효할 수 있습니까? 대답은 동기화를 사용하여 정적 메서드를 수정하는 것입니다. 클래스는 이 클래스의 소유라고 할 수 있습니다. 클래스는 클래스의 인스턴스에 의존하지 않으므로 다른 인스턴스 간의 동기화를 달성하기 위해 클래스의 정적 메서드를 수정하려면 동기화 키워드만 사용하면 됩니다.