Java의 동기화에 대한 종합 가이드

게시 됨: 2022-05-20

Java에서 동기화를 설명하기 전에 멀티스레딩의 개념을 간단히 다시 살펴봐야 합니다. Java의 멀티스레딩 기능을 사용하면 CPU 활용을 극대화하기 위해 프로그램의 두 개 이상의 부분을 동시에 실행할 수 있습니다. 이러한 프로그램의 각 부분은 스레드이고 스레드는 프로세스 내의 경량 프로세스입니다.

이제 프로그램의 여러 스레드가 동일한 리소스에 액세스하려고 시도하여 부정확한 결과를 생성할 수 있습니다. 따라서 특정 시점에 하나의 스레드만 리소스에 액세스할 수 있도록 동기화해야 합니다.

Java에서 동기화가 무엇인지 에 대한 이 가이드 에서는 예제를 통해 동기화 개념을 자세히 살펴봅니다.

목차

Java에서 동기화란 무엇입니까?

Java 동기화는 공유 리소스에 대한 여러 스레드의 액세스를 제어하는 ​​기능입니다. 다중 스레드 Java 프로그램이 동일한 리소스에 액세스하려고 시도하여 잘못된 결과를 생성할 때 유용합니다. Java 동기화 기능을 사용하면 단일 스레드만 지정된 시점에 리소스에 도달할 수 있습니다.

Java는 동일한 객체에서 동기화되고 한 번에 하나의 스레드만 내부에서 실행할 수 있는 동기화된 블록을 사용하여 스레드의 작업을 동기화하는 방법을 제공합니다. 이러한 블록은 synchronized 키워드로 표시되어 블록 안에 이미 있는 스레드가 실행을 끝내고 블록을 떠날 때까지 동기화된 블록에 들어가려는 다른 스레드를 차단합니다.

동기화된 블록 작성을 위한 구문

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

동기화된( lockObject )

{

// 동기화된 문

}

위의 구문에서 lockObject 는 동기화된 요소와 관련된 잠금을 가진 객체를 나타냅니다. 이제 Java의 잠금 개념을 살펴보겠습니다.

자바의 잠금

Java의 동기화는 잠금 또는 모니터를 중심으로 구축됩니다. 모든 개체에는 연결된 잠금이 있습니다. 이상적으로는 개체의 필드에 액세스해야 하는 스레드가 먼저 개체의 잠금을 획득해야 합니다. 잠금은 동기화 블록보다 더 정교하고 유연한 스레드 동기화 메커니즘입니다. 이것은 광범위한 잠금 구현을 포함하는 java.util.concurrent.lock 패키지 내부에 정의됩니다.

세계 최고의 대학에서 온라인 소프트웨어 개발 과정을 배우십시오. 이그 제 큐 티브 PG 프로그램, 고급 인증 프로그램 또는 석사 프로그램을 획득하여 경력을 빠르게 추적하십시오.

자바 동기화 방법

Java 동기화 방법의 목적은 공유 리소스에 대한 개체를 잠그는 것입니다. 따라서 스레드가 동기화된 메서드를 호출할 때 메서드는 자동으로 해당 개체에 대한 잠금을 가져오고 스레드가 작업을 실행하면 잠금을 해제합니다.

다음은 Java 동기화 방법의 예입니다.

//자바 동기화 메소드의 예

클래스 테이블{

동기화된 무효 printTable(int n){//동기화된 메서드

for(int i=1;i<=5;i++){

System.out.println(n*i);

노력하다{

Thread.sleep(400);

} catch(예외 e){System.out.println(e);}

}

}

}

클래스 MyThread1은 스레드를 확장합니다.{

표 t;

MyThread1(테이블 t){

this.t=t;

}

공개 무효 실행(){

t.printTable(5);

}

}

클래스 MyThread2는 스레드를 확장합니다.{

표 t;

MyThread2(테이블 t){

this.t=t;

}

공개 무효 실행(){

t.printTable(100);

}

}

공개 클래스 TestSynchronization2{

공개 정적 무효 메인(문자열 인수[]){

Table obj = new Table();//객체 하나만

MyThread1 t1=새로운 MyThread1(obj);

MyThread2 t2=새로운 MyThread2(obj);

t1.start();

t2.start();

}

}

산출:

5

10

15

20

25

100

200

300

400

500

동기화가 없으면 어떻게 됩니까?

이제 동기화가 없는 이전 프로그램을 살펴보겠습니다(synchronized 키워드가 없음에 유의).

클래스 테이블{

void printTable(int n){//메서드가 동기화되지 않았습니다.

for(int i=1;i<=5;i++){

System.out.println(n*i);

노력하다{

Thread.sleep(400);

} catch(예외 e){System.out.println(e);}

}

}

}

클래스 MyThread1은 스레드를 확장합니다.{

표 t;

MyThread1(테이블 t){

this.t=t;

}

공개 무효 실행(){

t.printTable(5);

}

}

클래스 MyThread2는 스레드를 확장합니다.{

표 t;

MyThread2(테이블 t){

this.t=t;

}

공개 무효 실행(){

t.printTable(100);

}

}

클래스 TestSynchronization1{

공개 정적 무효 메인(문자열 인수[]){

Table obj = new Table();//객체 하나만

MyThread1 t1=새로운 MyThread1(obj);

MyThread2 t2=새로운 MyThread2(obj);

t1.start();

t2.start();

}

}

산출:

5

100

10

200

15

300

20

400

25

500

보시다시피 동기화가 없으면 출력이 일관되지 않습니다.

인기 있는 소프트웨어 엔지니어링 과정 살펴보기

에스엘. 아니 소프트웨어 개발 프로그램
1 LJMU 및 IIITB의 컴퓨터 과학 석사 Caltech CTME 사이버 보안 인증 프로그램
2 전체 스택 개발 부트캠프 블록체인 PG 프로그램
소프트웨어 개발의 이그 제 큐 티브 포스트 대학원 프로그램 - DevOps 전문화 모든 소프트웨어 엔지니어링 코스 보기

Java의 동기화 유형

Java에서 스레드 동기화가 무엇인지 답하기 위해 스레드 동기화와 프로세스 동기화라는 두 가지 유형의 동기화를 사용할 수 있습니다.

각각이 의미하는 바를 이해합시다.

스레드 동기화: 여러 스레드가 공유 리소스에 액세스하려고 할 때 한 번에 한 스레드에서만 리소스를 사용하도록 해야 합니다. 스레드 동기화는 여러 스레드가 동시에 리소스를 사용하려고 할 때 한 스레드만 공유 리소스를 사용하도록 허용하는 프로세스입니다.

프로세스 동기화: 프로세스가 적절한 실행 순서를 커밋한 상태에 도달하기 위해 여러 프로세스를 동시에 실행하는 것을 말합니다. 두 개 이상의 프로세스가 협력하고 한 프로세스의 실행이 다른 프로세스에 영향을 미칠 때 프로세스 동기화가 필요합니다. 따라서 프로세스 동기화는 부정확한 출력 가능성을 제거하고 적절한 실행 순서를 보장합니다.

Java의 동기화 방법

일반적으로 Java에는 네 가지 동기화 방법이 있습니다.

  • 동기화된 정적 메서드
  • 동기화된 인스턴스 메서드
  • 정적 메서드 내부의 동기화된 블록
  • 인스턴스 메소드 내부의 동기화된 블록

자바 동기화의 각 방법을 좀 더 자세히 살펴보자.

동기화된 정적 메서드

여기에서, 우리는 자바에서 정적 메소드를 표시하기 위해 동기화된 키워드를 사용합니다. 다음은 Java 동기화 정적 메서드의 예입니다.

공개 정적 MyStaticCounter {

개인 정적 정수 수 = 0;

공개 정적 동기화 무효 증가(int 값) {

카운트 += 값;

}

}

동기화된 인스턴스 메서드

인스턴스 메서드와 함께 동기화된 블록을 사용할 때 각 개체에는 동기화된 메서드가 있습니다. 각 개체는 메서드 내에서 실행할 수 있는 스레드를 하나만 가질 수 있습니다. 여러 객체가 있는 경우 블록 내부의 각 객체에 대해 단일 스레드를 실행할 수 있습니다.

공개 클래스 MyCounter {

개인 정수 수 = 0;

공개 동기화 무효 증가(int 값) {

this.count += 값;

}

공개 동기화 무효 감소(int 값) {

this.count -= 값;

}

}

정적 메서드 내부의 동기화된 블록

다음은 정적 메서드 내에서 동기화된 블록을 사용하는 예입니다.

공개 클래스 MyClass {

공개 정적 무효 인쇄(문자열 메시지) {

동기화된(MyClass.class) {

log.writeln(메시지);

}

}

}

인스턴스 메소드 내부의 동기화된 블록

전체 메소드를 동기화하는 대신 메소드 내의 특정 블록에 대해 동기화된 것을 사용할 수 있습니다. 다음은 동기화되지 않은 메서드 내부의 동기화된 코드 블록의 예입니다.

공개 무효 증가(int 값) {

동기화된(이) {

this.count += 값;

}

}

Java에서 동기화의 필요성

이제 Java에서 동기화가 무엇인지 알았 으므로 처음에 Java를 사용하는 이유가 궁금할 것입니다.

Java 동기화 키워드는 동시 프로그래밍에 필수적인 기능을 제공합니다. Java의 동기화가 도움이 되는 방법은 다음과 같습니다.

  • Java 동기화는 스레드 간의 경쟁 조건을 제거하고 공유 리소스에 대한 상호 배타적 액세스를 보장하는 잠금 기능을 제공합니다.
  • Java 동기화 잠금은 잠금 및 잠금 해제 기능을 모두 제공합니다. 따라서 스레드는 동기화된 메서드나 블록에 들어가기 전에 잠금을 획득해야 합니다.
  • 동기화된 키워드는 컴파일러에 의한 프로그램 명령문의 재정렬을 방지합니다.

결론

요약하면 Java의 동기화는 한 번에 하나의 스레드만 공유 리소스에 액세스할 수 있도록 합니다. Java synchronized 키워드를 사용하여 블록이나 메소드를 동기화할 수 있습니다. 스레드가 동기화된 블록 내부에 들어가고자 할 때 잠금을 획득해야 하며, 블록을 떠난 후 스레드는 잠금을 해제합니다. 메서드와 함께 또는 메서드 블록 내부에서 synchronized 키워드를 사용할 수 있습니다.

자바를 어디서 배울지 궁금하세요?

upGrad의 소프트웨어 공학 직무 연계 PG 인증 당신이 찾고있는 것입니다!

신입생 과 마지막 해를 위해 특별히 고안된 upGrad의 소프트웨어 엔지니어링 직업 연계 PG 인증 은 프로그래밍을 배우고 초급 소프트웨어 역할에 배치되기를 원하는 사람들에게 적합합니다. 이 5개월 온라인 프로그램은 Java, JavaScript, HTML5, DSA, AWS, MERN 등과 같은 최고의 소프트웨어 기술을 가르칩니다!

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

A: Java의 synchronized 키워드는 한 번에 하나의 스레드만 공유 리소스에 액세스할 수 있도록 합니다. 다중 스레드 Java 프로그램이 동일한 리소스에 액세스하려고 시도하여 부정확한 결과를 생성할 때 유용합니다.

Q: 동기화는 Java에서 어떻게 구현됩니까?

A: Java는 주어진 시간에 모니터를 소유하는 스레드가 하나만 있는 모니터 개념을 사용하여 동기화를 구현합니다. 스레드가 잠금을 획득하면 모니터에 액세스할 수 있으며 잠긴 모니터에 들어가려는 다른 모든 스레드는 첫 번째 스레드가 모니터를 떠날 때까지 차단된 상태로 유지됩니다.

Q: Java에서 교착 상태란 무엇입니까?

A: Java 교착 상태는 스레드가 객체 잠금을 기다리고 있지만 다른 스레드가 이를 획득하고 두 번째 스레드가 첫 번째 스레드가 획득한 객체 잠금을 기다리고 있을 때 발생합니다. 따라서 두 스레드는 서로가 잠금을 해제할 때까지 기다리므로 교착 상태가 발생합니다.