Gegründet 2006

java synchronized 예제

편집 : 동기화 블록 `동기화 (이)`와 `service.awaitTermination(…) ` 동기화 된 메서드와 함께 모든 시간 작동 하는 것 같지만 동기화 된 키워드는 다른 수준에서 사용할 수 있습니다: Java 프로그래밍 언어 는 두 가지 기본 동기화 숙어를 제공 합니다: 동기화 된 메서드와 동기화 된 문. 동기화된 두 문장 중 더 복잡한 문은 다음 섹션에 설명되어 있습니다. 이 섹션은 동기화된 메서드에 대해 입니다. (i) 현재 값을 읽고, (ii) 이 값을 1로 늘리고(iii) 변수에 새 값을 쓰는 등 세 단계를 수행해야 합니다. 두 스레드가 이러한 단계를 병렬로 수행하는 경우 두 스레드가 동시에 1단계를 수행하여 동일한 현재 값을 읽을 수 있습니다. 이렇게 하면 쓰기가 손실되므로 실제 결과가 낮아집니다. 위의 샘플에서 35증분은 카운트에 대한 동시 비동기화 액세스로 인해 손실되었지만 직접 코드를 실행할 때 다른 결과를 볼 수 있습니다. 메서드 선언에 동기화된 키워드를 추가하기만 하면 메서드가 동기화됩니다: 모든 암시적 모니터는 재진입 특성을 구현합니다. 재진입은 잠금이 현재 스레드에 바인딩된다는 것을 의미합니다. 스레드는 교착 상태에 빠지지 않고 동일한 잠금을 여러 번 안전하게 획득할 수 있습니다(예: 동기화된 메서드는 동일한 개체에서 다른 동기화된 메서드를 호출함). 이러한 메서드는 클래스와 연결된 Class 개체에서 동기화되며 클래스당 JVM당 하나의 클래스 개체만 존재하므로 인스턴스 수에 관계없이 클래스당 정적 동기화 된 메서드 내에서 하나의 스레드만 실행할 수 있습니다. 자바 8 은 위의 예에서와 같이 읽기 및 쓰기 잠금을 지원하는 StampedLock이라는 새로운 종류의 잠금장치와 함께 배송됩니다.

ReadWriteLock 스탬프 잠금의 잠금 메서드는 긴 값으로 표시 된 스탬프를 반환 합니다. 이러한 스탬프를 사용하여 잠금을 해제하거나 잠금이 여전히 유효한지 확인할 수 있습니다. 또한 스탬프가 찍힌 잠금은 낙관적 잠금이라는 또 다른 잠금 모드를 지원합니다. 동기화된 메서드는 스레드 간섭 및 메모리 일관성 오류를 방지하기 위한 간단한 전략을 사용합니다. (중요한 예외: 객체를 생성한 후 수정할 수 없는 최종 필드는 객체가 생성되면 동기화되지 않은 메서드를 통해 안전하게 읽을 수 있음). 이 전략은 효과적이지만 이 과의 후반부에서 볼 수 있듯이 생생에 문제가 발생할 수 있습니다. 인스턴스 메서드는 메서드를 소유 하는 클래스의 인스턴스를 통해 동기화 됩니다. 즉, 클래스의 인스턴스당 하나의 스레드만 이 메서드를 실행할 수 있습니다. 이 빠른 문서는 Java에서 동기화 된 블록을 사용하는 소개가 될 것입니다. singleton 클래스에서 동기화된 경우 한 명의 사용자만 개체에 액세스할 수 있습니다. 100 명의 사용자가 동일한 개체에 액세스하려는 경우 100 번째 사용자에게 걸리는 시간과 같은 모든 사용자에 대한 잠금을 해제하는 데 몇 초가 걸릴 수 있습니까? 이 시나리오에서는 어떻게 처리할 수 있습니까? 안녕하세요 동기화 된 블록을 사용하여 동일한 코드를 실행했습니다.

스레드에서 대체 출력을 제공합니다. 내부적으로 Java는 동기화를 관리하기 위해 모니터 잠금 또는 내장 잠금이라고도 하는 소위 모니터를 사용합니다.

Comments are closed.