• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

chap12 -05 동기화 질문

23.01.19 15:33 작성 조회수 171

0

package chap_12;

import chap_12.clean.Room;

public class _05_Synchronization {
    public static void main(String[] args) {
        Room room = new Room();


        Runnable cleaner1 = () -> {
            System.out.println("-- 직원1 청소 시작 --");
            for (int i = 1; i <= 5; i++) {
                room.clean("직원1");
            }
            System.out.println("직원1 청소 끝!");
        };
        Runnable cleaner2 = () -> {
            System.out.println("-- 직원2 청소 시작 --");
            for (int i = 1; i <= 5; i++) {
                room.clean("직원2");
            }
            System.out.println("직원2 청소 끝!");
        };

        Thread cleanerThread1 = new Thread(cleaner1);
        Thread cleanerThread2 = new Thread(cleaner2);

        cleanerThread1.start();
        cleanerThread2.start();
    }
}
package chap_12.clean;

public class Room {
    public int number = 1;

    synchronized public void clean(String name) {
        System.out.println(name + " : " + number + "번방 청소 중!");
        number++;
    }
}

Room class 에서 synchronized 를 빼면 실행할때마다 직원 1, 2 가 섞여서 나오는데 동기화를 넣어주면

아무리 여러번 실행하더라도

 

-- 직원1 청소 시작 --

-- 직원2 청소 시작 --

직원1 : 1번방 청소 중!

직원1 : 2번방 청소 중!

직원1 : 3번방 청소 중!

직원1 : 4번방 청소 중!

직원1 : 5번방 청소 중!

직원1 청소 끝!

직원2 : 6번방 청소 중!

직원2 : 7번방 청소 중!

직원2 : 8번방 청소 중!

직원2 : 9번방 청소 중!

직원2 : 10번방 청소 중!

직원2 청소 끝!

의 결과 밖에 나오지 않습니다. 제 코드에서 문제 되는 부분이 있을가요? ㅠㅠ

답변 1

답변을 작성해보세요.

0

안녕하세요?
쓰레드는 강의에서 사용한 것처럼 아주 빠르게 실행되는 예제인 경우 종종 이런 결과를 볼 수도 있습니다. for 문 내에서 임의로 어느 정도 시간이 걸리는 것을 흉내내기 위해 Thread.sleep(200); 정도를 넣어서 방 청소를 할 때마다 0.2 초씩 소요되도록 하면 직원1, 직원2가 섞여서 출력되는 것을 확인하실 수 있을 거예요 🤗

질문으로 적어주신 코드에 앞에서 설명드린 코드(주석 부분) 를 추가하였습니다. 직원이 섞여서 청소를 하되, 동시에 2개 방이 중복해서 청소되는 일이 없는지 확인해주시면 됩니다.

package chap_12;

import chap_12.clean.Room;

public class _05_Synchronization {
    public static void main(String[] args) {
        Room room = new Room();


        Runnable cleaner1 = () -> {
            System.out.println("-- 직원1 청소 시작 --");
            for (int i = 1; i <= 5; i++) {
                room.clean("직원1");
// 코드 추가 시작부분
                try {
                    Thread.sleep(200); // 청소하는데 소요되는 시간 0.2초 추가
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
// 코드 추가 끝 부분
            }
            System.out.println("직원1 청소 끝!");
        };
        Runnable cleaner2 = () -> {
            System.out.println("-- 직원2 청소 시작 --");
            for (int i = 1; i <= 5; i++) {
                room.clean("직원2");
// 코드 추가 시작부분
                try {
                    Thread.sleep(200); // 청소하는데 소요되는 시간 0.2초 추가
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
// 코드 추가 끝 부분
            }
            System.out.println("직원2 청소 끝!");
        };

        Thread cleanerThread1 = new Thread(cleaner1);
        Thread cleanerThread2 = new Thread(cleaner2);

        cleanerThread1.start();
        cleanerThread2.start();
    }
}

이해에 도움되시길 바라겠습니다.
감사합니다 😊