inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

나도코딩의 자바 기본편 - 풀코스 (20시간)

chap12 -05 동기화 질문

해결된 질문

262

쿰창쿰창

작성한 질문수 2

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 청소 끝!

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

oop java

답변 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();
    }
}

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

자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?

1

146

2

static이 뭐였는지 기억이 안나요 ㅜㅜ

0

119

2

Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의

0

72

1

사고력 키우는 법이 어떤게 있나요?

0

94

2

getter setter

0

103

2

섹션9. 66 메소드 오버로딩 시 질문이 있습니다.

0

80

1

안녕하세요 갑자기 프로그램 에러가 떠서 안되네요

0

76

2

변수 이름짓는법

0

114

2

intelli J 실행오류

0

115

2

혹시 이건 수학적 사고가 부족한 걸까요?

0

152

2

영상이 재생이 안됩니다.

0

167

3

이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.

0

117

2

응용이 어렵습니다.

0

207

2

IntelliJ가 보이지 않습니다.

0

187

3

JDK 버전 문의

0

130

2

BlackBox 파일 내에서 메소드 정의

0

136

1

동기화

0

123

2

Iterator 문의

0

105

1

코드 순서 문의

0

143

1

클래스 메소드

0

150

2

Quiz_05 관련 질문드립니다 !

0

118

2

다운로드가 안됩니다

0

165

2

다형성

0

120

2

HashMap

0

81

2