프로그래머스 자바 쓰레드와 상태제어

조회수 737회

제가 프로그래머스 에서 '자바 중급 쓰레드와 상태제어'강의를 들었는데

이해가 안되는 부분이 있어서 질문드립니다!

synchronized 블록에 대한겁니다.

강의에서 사용한 코드를 보여드리면

public class ThreadB extends Thread{
   // 해당 쓰레드가 실행되면 자기 자신의 모니터링 락을 획득
   // 5번 반복하면서 0.5초씩 쉬면서 total에 값을 누적
   // 그후에 notify()메소드를 호출하여 wiat하고 있는 쓰레드를 깨움 
    int total;
    @Override
    public void run(){
        synchronized(this){
            for(int i=0; i<5 ; i++){
                System.out.println(i + "를 더합니다.");
                total += i;
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            notify();
        }
    }
}

public class ThreadA {
    public static void main(String[] args){
        // 앞에서 만든 쓰레드 B를 만든 후 start 
        // 해당 쓰레드가 실행되면, 해당 쓰레드는 run메소드 안에서 자신의 모니터링 락을 획득
        ThreadB b = new ThreadB();
        b.start();

        // b에 대하여 동기화 블럭을 설정
        // 만약 main쓰레드가 아래의 블록을 위의 Thread보다 먼저 실행되었다면 wait를 하게 되면서 모니터링 락을 놓고 대기       
        synchronized(b){
            try{
                // b.wait()메소드를 호출.
                // 메인쓰레드는 정지
                // ThreadB가 5번 값을 더한 후 notify를 호출하게 되면 wait에서 깨어남
                System.out.println("b가 완료될때까지 기다립니다.");
                b.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }

            //깨어난 후 결과를 출력
            System.out.println("Total is: " + b.total);
        }
    }
}

다음과 같습니다.

여기서 ThreadB클래스에서 run메서드 안에서 synchronized(this)를 쓰면서 이 객체를 사용하는 쓰레드에 대해서 동기화가 된다고 이해했습니다.

그런데 main클래스에서 synchronized(b)를 하면서 ThreadB의 객체 b를 넣었습니다. 여기서는 b가 왜 들어가는지 모르겠습니다ㅠㅠ

여기서 들어가게 되면 run에 있는 syncrhonized구문과...음 그냥 꼬여버렸습니다ㅠㅠㅠ

main에 있는 synchronized구문은 mainThread에 대해서가 아닌 b에 접근하는 thread에 대해 동기화하는건데 sleep을 통해 mainThread가 sleep하게 되는건가요?

멀티쓰레드부분은 구글링을 해도 이해가 안되는것같습니다ㅠㅠㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)