Thread1은 개체의 인스턴스를 만들고 동기화된 문으로 인해 본질적인 잠금을 획득하는 메서드를 호출합니다. 한편 Thread2는 동일한 다른 인스턴스에 대한 참조를 보유하고 doSomething 메서드를 호출하여 다른 내재 잠금을 획득합니다. 이 문서에서는 Java 및 Kotlin 작업의 여러 유형의 동기화, 잠금 및 스레드 안전에 대해 대화형 예제를 통해 설명합니다. 예제를 실행 하기 위해 SyncMethodRunnable의 두 인스턴스를 실행 하는 두 개의 스레드를 만듭니다. 두 스레드 모두 SynchronizedMethodClass 클래스의 동일한 인스턴스를 사용합니다. 따라서 두 스레드 모두 SynchronizedMethodClass 개체의 동기화된 메서드를 호출합니다. 당신이 자바 / 코틀린과 안드로이드에 대한 더 많은 유익하고 심층적 인 기사에 관심이 있다면 매체에 나를 따르라. 당신은 또한 트위터에 저를 핑 할 수 있습니다 @TheSNAKY 🍻. 동기화 된 방법을 이해하려면 (Java의 동기화 된 함수 수정자 키워드와 Kotlin의 주석@Synchronized 으로 덴토화). Count가 SynchronizedCounter의 인스턴스인 경우 이러한 메서드를 동기화하는 것은 두 가지 효과가 있습니다. 지정된 클래스의 다음 방법을 고려하십시오: 동기화된 메서드를 사용하면 스레드 간섭 및 메모리 일관성 오류를 방지하기 위한 간단한 전략을 사용할 수 있습니다. 개체가 둘 이상의 스레드에 표시되는 경우 모든 읽기 또는 해당 개체의 필드에 쓰기는 동기화된 메서드를 통해 수행됩니다.

Java 프로그래밍 언어는 동기화된 블록을 사용하여 스레드를 만들고 작업을 동기화하는 매우 편리한 방법을 제공합니다. 공유 리소스를 이 블록 내에 유지합니다. 다음은 동기화 된 문장의 일반적인 형태입니다 – 이제 동기화가 설명되었습니다, 의의 휘발성에 살펴 보자. 증분은 메모리에서 현재 값을 읽고 증분하고 메모리에 다시 쓰는 것으로 구성됩니다. 이 작업이 동기화되지 않은 경우 일관성이 없을 수 있습니다(예: 증분 손실). 동기화된 메서드는 스레드 간섭 및 메모리 일관성 오류를 방지하기 위한 간단한 전략을 사용합니다. (중요한 예외: 객체를 생성한 후 수정할 수 없는 최종 필드는 객체가 생성되면 동기화되지 않은 메서드를 통해 안전하게 읽을 수 있음). 이 전략은 효과적이지만 이 과의 후반부에서 볼 수 있듯이 생생에 문제가 발생할 수 있습니다.

Java에서 동기화된 컬렉션을 처리하는 방법에는 여러 가지가 있습니다. 그리고 이전 예제에서 상상할 수 있듯이 getThirdVariable()는 한 번에 하나의 스레드에서만 액세스됩니다. 이를 통해 변수는 모든 스레드 실행에서 동기화된 상태로 유지됩니다.