Java에서의 동기화 : 무엇을, 어떻게, 왜?



Java의 동기화에 대한이 기사는 다중 스레드 프로그램 동기화에 대해 학습하는 방법을 안내하는 데 도움이됩니다.

다중 스레드 프로그램은 정기적으로 여러 사기적이고 놀라운 결과를 초래하는 동일한 리소스에 접근하려고합니다. 이것은 Java에서 동기화를 사용하여 해결할 수 있습니다. 주어진 시간에 단일 특정 스레드 만 리소스에 접근 할 수 있습니다. 이 문서는 동기화 전략에 익숙해지는 데 도움이됩니다.

다음 순서로 주제를 논의하겠습니다.





시작하자!

Java에서 동기화를 사용하는 이유는 무엇입니까?



프로그램 내에서 적어도 두 개의 스레드로 시작하면 여러 스레드가 동일한 리소스에 접근하려고 시도 할 수 있습니다. 동시성 문제로 인해 예기치 않은 결과가 발생할 수도 있습니다.

통사론 :

동기화 (objectidentifier) ​​{// 공유 변수 및 기타 공유 리소스에 액세스}

예를 들면 동등한 파일 내에서 쓰기를 시도합니다. 스레드 중 하나가 데이터를 덮어 쓸 수 있거나 스레드가 데이터를 열 때 데이터가 손상 될 수 있습니다.다른 스레드가 같은 파일을 닫을 수 있습니다.여러 스레드의 작업을 동기화 할 필요가 있습니다. 이것은라는 개념을 사용하여 구현할 수 있습니다. 미디엄 onitors .



  • 마다 스레드가 잠 그거나 잠금 해제 할 수있는 모니터와 연관됩니다.
  • 한 번에 하나의 스레드 만 모니터에서 잠금을 유지할 수 있습니다.
  • 자바 프로그래밍 언어는 스레드를 생성하고 작업을 동기화하는 매우 편리한 방법을 제공합니다. 동기화 됨 블록.
  • 또한이 특정 블록 내에서 공유 리소스를 유지합니다.

Java에서 동기화 된 블록은 동기화 됨 예어. Java의이 블록은 일부 개체에서 동기화됩니다.동일한 객체에서 동기화되는 모든 블록은 한 번에 하나의 스레드 만 실행할 수 있습니다. 동기화 된 블록에 들어 가려는 다른 모든 스레드는 동기화 된 블록 내부의 스레드가 블록을 종료 할 때까지 차단됩니다.

동기화 유형

기본적으로 두 가지 유형의 동기화를 사용할 수 있습니다. 그들은:

  1. 프로세스 동기화 : 특정 일련의 작업을 수행하는 상태에 도달하기 위해 여러 스레드 또는 프로세스를 동시에 실행하는 것입니다.
  2. 스레드 동기화 : 두 개 이상의 스레드가공유 리소스에 액세스를 시도하는 경우 리소스가 한 스레드에서만 사용되는지 확인해야합니다.시간.

이러한 유형에 대해 자세히 다루지 말고 잠금 장치가 무엇인지 이해하려고 .

추상 클래스와 인터페이스의 차이점

자바의 잠금

앞서 언급했듯이 동기화는 자물쇠 또는 감시 장치 . 각각의 모든 개체에는 관련된 잠금이 있습니다. 따라서 객체의 필드에 대한 일관된 액세스가 필요한 스레드는 객체에 액세스하기 전에 객체의 잠금을 획득 한 다음 작업이 완료되면 잠금을 해제해야합니다.

Java 5에서 패키지 java.util.concurrent.locks에는 많은 잠금 구현이 포함되어 있습니다.

잠금은 다음과 같습니다.

공용 클래스 잠금 {개인 부울 isLocked = false 공용 동기화 된 void lock () throws InterruptedException {while (isLocked) {wait ()} isLocked = true} 공용 동기화 된 void unlock () {isLocked = false notify ()}}

lock () 메서드는 lock ()을 호출하는 모든 스레드가 unlock ()이 실행될 때까지 차단되도록 Lock 인스턴스를 잠급니다.

동기화없는 멀티 스레딩

다음은 카운터 값을 시퀀스로 인쇄하고 실행할 때마다 스레드에 대한 CPU 가용성에 따라 다른 결과를 생성하는 간단한 예제입니다. 이것 좀 봐!

파이썬에서 십진수에서 이진수로
class Multithread {public void printCount () {try {for (int i = 5 i<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

위 프로그램의 결과는 다음과 같습니다.

Java- Edureka의 출력 동기화

동기화를 통한 멀티 스레딩

위와 같은 예이지만 순서대로 카운터 값을 출력합니다. 실행할 때마다 동일한 결과가 생성됩니다.

class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ( 'Counter ---'+ i)}} catch (Exception e) {System. out.println ( 'Thread interrupted.')}}} class Thread extends Multithread {private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {synchronous ( MT) {MT.printCount ()} System.out.println ( 'Thread'+ threadName + 'exiting.')} public void start () {System.out.println ( 'Starting'+ threadName) if (t == null) {t = new Thread (this, threadName) t.start ()}}} public class TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ( 'Thread -1 ', MT) Thread T1 = new Thread ('Thread-2 ', MT) T.start () T1.start () // 스레드가 끝날 때까지 기다립니다 try {T.join () T1.join ()} catch (예외 e) {System.out.println ( 'Interrupted')}}}

출력은 다음과 같습니다.

동기화 된 키워드

동기화 된 키워드 블록 또는 메소드를 중요 섹션으로 표시합니다. 중요 섹션은 한 번에 하나의 스레드 만 실행되고 스레드가 동기화 된 섹션에 대한 잠금을 보유하는 곳입니다. 이 동기화 됨 글쓰기에 도움이되는 키워드 병발 사정 응용 프로그램의 일부. 또한 블록 내의 공유 리소스를 보호합니다.

동기화 된 키워드는 다음과 함께 사용할 수 있습니다.

코드 블록에 대해 살펴 보겠습니다.

동기화 된 키워드 : 코드 블록

통사론

동기화 된 블록을 작성하는 일반적인 구문은 다음과 같습니다.

자바에서 일시적인 의미는 무엇입니까
동기화 됨 (lockObject) {// 동기화 된 문}

스레드가 블록 내에서 동기화 된 명령문을 실행하려면 lockObject의 모니터에서 잠금을 획득해야합니다. 한 번에 하나의 스레드 만 잠금 개체의 모니터를 얻을 수 있습니다. 따라서 다른 모든 스레드는 현재 실행중인 스레드가 잠금을 획득하고 실행을 완료 할 때까지 기다려야합니다.
이 방법으로 동기화 됨 키워드는 한 번에 하나의 스레드 만 동기화 된 블록 문을 실행하도록 보장하므로 여러 스레드가 블록 내부에있는 공유 데이터를 손상시키는 것을 방지합니다.

노트 :

  • 스레드가 잠자기 상태 인 경우 (사용 자다() 방법) 잠금을 해제하지 않습니다. 이 휴면 시간 동안 스레드는 동기화 된 블록 문을 실행하지 않습니다.
  • Java 동기화가 발생합니다. NullPointerException 잠금 객체가‘ 동기화 됨 (잠금) ‘은 null입니다.

이제 그 방법에 대해 논의 해 봅시다.

동기화 된 키워드 : 방법

통사론

작성을위한 일반적인 구문 동기화 된 방법 is :

동기화 된 메서드 (매개 변수) {// 동기화 된 코드}

여기 lockObject 동기화 된 명령문을 나타내는 모니터와 잠금이 연관된 오브젝트에 대한 참조 일뿐입니다.

동기화 된 블록과 마찬가지로 스레드는 동기화 된 메서드를 사용하여 연결된 모니터 개체에 대한 잠금을 획득해야합니다. 동기화 된 메서드의 경우 잠금 개체는 다음과 같습니다.

  • ‘.class’객체 – 주어진 방법이 공전 .
  • ‘this’개체 – 방법이 비 정적 . ‘this’는 동기화 된 메서드가 호출되는 현재 개체에 대한 참조입니다.

Java 동기화 된 키워드는 요각 자연에서. 즉, 동기화 된 메서드가 동일한 잠금을 필요로하는 다른 동기화 된 메서드를 호출하면 잠금을 보유하고있는 현재 스레드가 잠금을 획득하지 않고 해당 메서드에 들어갈 수 있습니다.

이 기사의 마지막 주제로 넘어 가서 동기화 된 키워드와 동기화 블록의 주요 차이점을 살펴 보겠습니다.

동기화 된 키워드와 동기화 된 블록의 차이점

  • 동기화 된 키워드를 방법 , 전체 메서드에 대해 객체에서 잠금을 획득합니다. 이는 호출 된 현재 스레드가 실행을 완료 할 때까지 다른 스레드가 동기화 된 메서드를 사용할 수 없음을 의미합니다.
  • 동기화 됨 블록 동기화 된 키워드가 지정된 후 괄호 사이에서만 객체에 대한 잠금을 획득합니다. 이는 블록이 종료 될 때까지 다른 스레드가 이미 잠긴 객체에 대한 잠금을 획득 할 수 없음을 의미합니다. 그러나 다른 스레드는 메서드에있는 나머지 코드에 액세스 할 수 있습니다.

이것으로 Java의 동기화가 정확히 어떻게 작동하는지 논의한이 기사의 끝으로 이동합니다. 이 튜토리얼에서 여러분과 공유 한 모든 내용이 명확하기를 바랍니다.

확인 전 세계에 걸쳐 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 작성했습니다. 우리는 당신의 여정의 모든 단계에서 당신을 돕기 위해 여기에 있습니다.이 자바 인터뷰 질문 외에 우리는 자바 개발자가되기를 원하는 학생과 전문가를 위해 설계된 커리큘럼을 마련했습니다.

질문이 있으십니까? 이 'Java의 동기화'의 주석 섹션에 언급하십시오. ' 기사와 우리는 가능한 한 빨리 당신에게 돌아갈 것입니다.