강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của ksq95116851
ksq95116851

câu hỏi đã được viết

Lập trình Java thực tế của Kim Young-han - Nâng cao phần 1, đa luồng và đồng thời

synchronized khối mã

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

Viết

·

86

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());
    }
}
java객체지향동시성multithreadthread

Câu trả lời 2

0

yh님의 프로필 이미지
yh
Người chia sẻ kiến thức

안녕하세요. 정동희님

이렇게 하면 t1과 t2가 동시에 실행되는 것이 아니라 t1의 실행이 끝난 다음에 t2가 실행되게 됩니다.

따라서 우리가 원하는 동시성을 얻지 못합니다.

감사합니다.

0

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

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

join 메서드에 대한 기본 이해

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

join만으로는 부족한가요?

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

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

synchronized 사용의 장점

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

더 나은 접근 방법

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

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

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

Hình ảnh hồ sơ của ksq95116851
ksq95116851

câu hỏi đã được viết

Đặt câu hỏi