안드로이드 synchronized 예제

여기서 objectidentifier는 동기화된 문이 나타내는 모니터와 잠금이 연관된 개체에 대한 참조입니다. 이제 두 개의 서로 다른 스레드를 사용하여 카운터를 인쇄하는 두 가지 예제를 살펴보겠습니다. 스레드가 동기화되지 않으면 순서가 없는 카운터 값을 인쇄하지만 synchronized() 블록 내부에 배치하여 카운터를 인쇄할 때 두 스레드 모두에 대해 카운터를 순서대로 인쇄합니다. 생성자는 구문 오류인 생성자와 동기화된 키워드를 사용하여 동기화할 수 없습니다. 생성자 동기화는 생성되는 동안 개체를 만드는 스레드만 이 에 액세스할 수 있어야 하므로 의미가 없습니다. 다른 개체 doSomething 메서드가 다른 개체 고유 잠금에서도 동기화되고 동일한 doSomething 메서드가 이 두 스레드에서 메서드를 실행하는 시나리오에서 동일한 doSomething 메서드가 개체의 secondMethod를 호출한다고 가정합니다. 교착 상태에 도달할 수 있습니다. 메서드가 동기화되지 않고 지정된 스레드가 카운터를 증분하는 경우 두 번째 스레드가 카운터 값을 읽을 때 두 번째 스레드가 첫 번째 스레드에서 쓰기 전에 쓰기가 발생하더라도 첫 번째 스레드에서 작성된 값을 읽을 수 있다고 보장할 수 없습니다. 시간 시계. 이 동작은 Java 메모리 모델 사양 때문입니다.

동기화 된 코드를 작성할 때 개체가 잠기고 잠금 해제되는 모든 방법을 고려해야합니다. 교착 상태는 컴파일러에서 검색할 수 없으므로 올바른 디자인으로 신중하게 방지해야 합니다. 동기화된 메서드는 스레드 간섭 및 메모리 일관성 오류를 방지하기 위한 간단한 전략을 사용합니다. (중요한 예외: 객체를 생성한 후 수정할 수 없는 최종 필드는 객체가 생성되면 동기화되지 않은 메서드를 통해 안전하게 읽을 수 있음). 이 전략은 효과적이지만 이 과의 후반부에서 볼 수 있듯이 생생에 문제가 발생할 수 있습니다. 특히 다른 개체 구현의 소유자가 아닌 경우 동기화되지 않은 섹션의 다른 인스턴스에서 메서드를 호출하는 것이 좋습니다. 다음 시나리오를 고려하십시오: 그리고 이전 예제에서 상상할 수 있듯이 getThirdVariable()는 한 번에 하나의 스레드에서만 액세스됩니다.