Warning: count(): Parameter must be an array or an object that implements Countable in /customers/2/7/7/fairbar.dk/httpd.www/wp-includes/post-template.php on line 284

스레드 동기화 예제

By 2. augustIkke-kategoriseret

동기화를 구현하려면 문 1과 2에 표시된 대로 동기화된 키워드로 메서드를 정의해야 합니다. 예를 들어, 두 개의 서로 다른 스레드 T1 및 T2가 있다고 가정하면 T1이 실행을 시작하고 T1이 반환 될 때 일부 결과를 계산하는 데 사용되는 file.txt 파일에 특정 값을 저장합니다. 한편 T2가 시작되고 T1이 반환되기 전에 T2는 파일 임시.txt(임시.txt는 공유 리소스)에 T1에 저장된 값을 변경합니다. 이제 분명히 T1은 잘못된 결과를 반환합니다. 위의 예제에서는 ThreadedSend 클래스의 run() 메서드 내에서 Sender 개체를 동기화 하도록 선택했습니다. 또는 전체 send() 블록을 동기화된 것으로 정의할 수 있으며 동일한 결과를 생성할 수 있습니다. 그런 다음 ThreadedSend 클래스의 run() 메서드 내에서 메시지 개체를 동기화할 필요가 없습니다. 다중 스레드 프로그래밍에서 여러 스레드가 동시에 실행되고 공통 리소스에 액세스합니다. 교착 상태를 방지하려면 리소스를 한 번에 한 스레드에서 공유해야 하거나 그렇지 않으면 이상하거나 예기치 않은 결과가 발생할 수 있는지 확인해야 합니다. 이 프로세스를 동기화라고 합니다.

이 기사에서는 java에서 스레드 동기화를 달성하는 방법에 대해 설명합니다. 스레드 동기화 상호 배타적 및 스레드 간 통신에는 두 가지 유형이 있습니다. 이러한 상황을 피하기 위해 스레드 동기화를 사용합니다. 스레드 동기화에서 스레드가 실행될 때마다 현재 스레드가 완전히 실행되지 않을 때까지 다른 스레드가 실행되지 않습니다. 다음은 동기화된 다중 스레딩의 예입니다. 두 개 이상의 스레드가 공유 리소스에 액세스하려고 할 때 리소스가 한 번에 하나의 스레드에서만 사용되도록 해야 합니다. 이를 달성하는 프로세스를 동기화라고 합니다. java의 동기화 키워드는 임계 섹션이라고 하는 코드 블록을 만듭니다.

다중 스레딩에서 동시에 실행되는 두 개 이상의 스레드가 부적절한 결과를 생성할 수 있는 경우가 있습니다. 예를 들어 스택 클래스의 두 가지 메서드 push() 및 pop()가 있습니다. 따라서 특정 시점에 한 스레드만 리소스에 액세스할 수 있도록 일부 동기화 메서드를 통해 확인해야 합니다. 예를 들어 이것을 이해합시다. 공통 파일 output.txt에 액세스하고 작성하는 두 개의 스레드가 있습니다. 동기화를 사용하지 않으면 한 스레드가 파일에 몇 단어를 쓰고 다른 스레드가 파일에 쓰기 시작합니다. 결과 파일에는 두 스레드에서 작성한 임의의 내용이 포함됩니다. 동기화를 사용하면 한 스레드가 파일에 쓰는 경우 파일이 LOCK 모드에서 잠기고 첫 번째 스레드가 작업을 완료할 때까지 다른 스레드 나 프로세스에 액세스할 수 없습니다. 프로그램 내에서 두 개 이상의 스레드를 시작할 때 여러 스레드가 동일한 리소스에 액세스하려고 시도하고 마지막으로 동시성 문제로 인해 예기치 않은 결과를 생성할 수 있는 상황이 발생할 수 있습니다.

예를 들어 여러 스레드가 동일한 파일 내에서 작성하려고 하면 스레드 중 하나가 데이터를 재정의할 수 있거나 한 스레드가 동일한 파일을 동시에 여는 동안 다른 스레드가 동일한 파일을 닫을 수 있으므로 데이터가 손상될 수 있습니다. 또한 문 3에 표시된 대로 동기화를 구현하기 위해 동기화된 블록을 정의할 수도 있습니다. Java에서 동기화된 키워드는 성능 비용을 발생시킵니다. Java에서 동기화된 메서드는 매우 느리며 성능이 저하될 수 있습니다. 따라서 필요한 경우 java에서 동기화 키워드를 사용해야하며 중요한 섹션만 동기화하는 데 사용되는 Java 동기화 블록을 사용해야합니다. 여기서 objectidentifier는 동기화된 문이 나타내는 모니터와 잠금이 연관된 개체에 대한 참조입니다. 이제 두 개의 서로 다른 스레드를 사용하여 카운터를 인쇄하는 두 가지 예제를 살펴보겠습니다. 스레드가 동기화되지 않으면 순서가 없는 카운터 값을 인쇄하지만 synchronized() 블록 내부에 배치하여 카운터를 인쇄할 때 두 스레드 모두에 대해 카운터를 순서대로 인쇄합니다.

leder

Author leder

More posts by leder