강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

정동희님의 프로필 이미지
정동희

작성한 질문수

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

synchronized 코드 블럭

synchronized 대신 join 을 사용하여 순서를 보장할 경우 해법이 아닌가요?

작성

·

6

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

synchronized 이전 강의에서 join 을 활용하여 순서를 쓰레드의 순서를 보장하여 실행하는 방법에 대해 배웠습니다.

 

만약 동시에 같은 값에 대해 접근하는 것이 문제 라고 가정 할 경우 join 을 활용하여 특정 쓰레의 종료 이전 까지 다음 쓰레드 를 시작하는 것을 막는 다면 해결할수 있는 문제가 아닌가 생각합니다.

예를들어 다음과 같이 t1.join() 을 사용하면 t1 의 쓰레드가 종료 이전 까지는 t2 는 대기 상태가 될 것이고 t1 에서 최종 결과가 나오기 전까지는 t2 는 실행하지 못할 것 입니다.

public class BankMain {

    public static void main(String[] args) throws InterruptedException {
        //BankAccount account = new BankAccountV1(1000);
        BankAccount account = new BankAccountV1(1000);

        Thread t1 = new Thread(new WithdrawTask(account, 800), "t1");
        Thread t2 = new Thread(new WithdrawTask(account, 800), "t2");

        t1.start();
        t1.join();



        sleep(500);
        log("t1 state :"+t1.getState());
        log("t2 state :"+t2.getState());

        t2.start();

        //t2.join();

        log("최종 잔액 : "+account.getBalance());
    }
}

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 정동희님.

질문 내용을 보니 join 메서드를 사용하여 스레드의 순서를 제어하여 동기화 문제를 해결할 수 있는지에 대한 궁금증이 있으신 것 같습니다. join 메서드는 특정 스레드가 종료될 때까지 기다리도록 메인 스레드나 다른 스레드의 실행을 중지할 수 있지만, 동기화 문제에 대한 완벽한 해결책은 아닙니다.

join 메서드에 대한 기본 이해

join을 사용하면 특정 스레드가 종료될 때까지 현재 스레드가 대기하게 됩니다. 이를 통해 스레드 간의 특정 실행 순서를 보장할 수 있지만, 실제로 여러 개의 스레드가 동일 객체에 동시 접근하게 되는 상황에서는 문제가 될 수 있습니다. 예를 들어, 스레드 t1이 작업을 완료할 때까지 t2를 대기시키는 것은 가능하지만, 동시성 안전성을 확보하기에는 부족합니다.

join만으로는 부족한가요?

  1. Concurrency 제어 부재: join은 단순히 순서를 보장할 뿐, 한 임계구역에 대한 동시 접근을 제어하지는 않습니다. 즉, 한꺼번에 여러 스레드가 접근할 수 없는 특정 코드 블록을 정의하거나, 데이터 일관성을 자동으로 보장하지 않습니다.

  2. 데드락과 성능 문제: join을 과도하게 사용하면 필요 이상으로 스레드가 대기해야 하는 문제가 발생할 수 있으며, 자칫하면 데드락과 같은 예상치 못한 문제를 유발할 수 있습니다.

synchronized 사용의 장점

  • 간단한 사용법: synchronized 키워드를 사용하여 간단히 객체나 블록을 잠글 수 있습니다.
  • 사이드 이펙트 최소화: 코드 블록 내에서 발생할 수 있는 예상치 못한 경쟁 상태나 일관성 문제를 피할 수 있습니다.

더 나은 접근 방법

synchronized는 실제로 임계구역에 접근할 때 객체나 메서드를 잠그는 방식으로 데이터의 일관성과 동기화를 보장하는 데 효과적입니다. 이는 각 스레드의 실행이 서로의 작업 완료를 기다리지 않더라도 안전하게 데이터를 접근하거나 수정할 수 있도록 합니다.

참고 게시물 안내:
- 동시성 문제를 해결하는 상황에서 Join의 사용 법
- Concurrency 문제의 해결법: synchronize 메서드의 적절한 활용

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

정동희님의 프로필 이미지
정동희

작성한 질문수

질문하기