Java 다중 스레딩 동시성 예제에서 경쟁 조건을 발견했습니까? 그것을 처리하는 방법?

게시 됨: 2019-12-11

have-you-notated-race-condition-in-java-multi-threading-concurrency-example

언젠가 나는 생산자 소비자 예제와 Java에서 읽기/쓰기 작업을 더 잘 처리하는 방법에 대한 기사를 작성했습니다. 비슷한 참고로 이 튜토리얼에서는 Race ConditionThread locking 에 대해 논의할 것입니다.

아래 질문 중 하나라도 있으면 올바른 위치에 있습니다.

  • 자바 경쟁 조건 예
  • 뮤텍스 자바 예제
  • 멀티스레딩 – 경쟁 조건이란 무엇입니까?
  • 경쟁 조건 및 크리티컬 섹션
  • 레이스 컨디션이란?
  • 예제를 사용하여 Java에서 경쟁 조건을 처리하는 방법

Java에서 경쟁 조건이 발생하는 이유는 무엇입니까?

Java의 경쟁 조건은 two or more threadssame time 공유 데이터를 수정/업데이트하려고 할 때 발생합니다.

아래 프로그램 로직을 살펴보겠습니다.

이것은 withdraw100 times deposit 하는 매우 간단한 은행 업무의 예입니다. $100 총 100번 입금 = $100 x 100 = $10,000, $50 총 100번 출금 = $50 x 100 = $5,000 프로그램이 끝나면 은행에 $5000가 있어야 합니다.

단계는 다음과 같습니다.

  1. CrunchifyRaceCondition.java 클래스 생성
  2. CrunchifyTransaction.java 클래스 생성
  3. CrunchifyBankAccount.java 클래스 생성
  4. CrunchifyRaceCondition 클래스를 실행하고 루프를 100회 입출금을 시작합니다.
  5. 결과를 확인하기 위해 with Synchronized block 으로 실행합니다.
  6. 결과를 확인하기 위해 without Synchronized block 실행합니다.

CrunchifyRaceCondition.java

CrunchifyTransaction.java

CrunchifyBankAccount.java

위의 24행과 34행을 확인하십시오. 해당 Synchronized 키워드를 유지하고 프로그램을 실행하십시오. 아래 이미지와 같이 올바른 결과를 확인해야 합니다.

자바 동기화 블록 키워드 - Crunchify

이제 24행과 34행에서 동기화된 키워드를 제거하고 동일한 프로그램을 실행하십시오.

문제를 확인하려면 이 프로그램을 여러 번 실행해야 할 수도 있습니다. Java에서는 항상 Race condition이 표시된다는 보장이 없습니다.

동기화된 블록 키워드가 없는 Java - Crunchify

엔터프라이즈 수준의 응용 프로그램이 있고 초당 수백만 건의 트랜잭션에 대해 이야기하는 경우 경쟁 조건으로 인해 회사에 재앙이 발생할 수 있습니다.

이제 질문은 Java 애플리케이션에서 경쟁 조건을 피하는 방법입니다.

  1. 경쟁 조건이 일부 공유 메모리 내 데이터 구조에 대한 업데이트에 있는 경우 적절한 방식으로 데이터 구조에 대한 액세스 및 업데이트를 동기화해야 합니다.
  2. 경합 조건이 데이터베이스 업데이트에 있는 경우 적절한 세분성 수준에서 트랜잭션을 사용하도록 SQL을 재구성해야 합니다.
  3. 프로덕션 환경에 들어가기 전에 부하 테스트를 수행하는 것은 나쁜 생각이 아닙니다. 더 많은 로드는 희귀한 경쟁 조건을 유발할 수 있습니다. 나중에 고치는 것보다 먼저 고치는 것이 좋습니다.
  4. 작성하는 전역 변수가 없는지 확인하십시오.
  5. Java에서 모든 개체에는 하나의 모니터와 연결된 뮤텍스가 있습니다. 단일 모니터에는 여러 개의 문이 있지만 각각은 synchronized 키워드로 표시됩니다. 스레드가 synchronized 키워드를 통과하면 모든 문을 효과적으로 잠급니다.
  6. 물론 쓰레드가 synchronized 키워드를 통과하지 못한다면 문이 잠긴 것이 아니며 다른 쓰레드는 언제든지 자유롭게 끼어들 수 있습니다.