이전 학습 내용

Thread 임계 구역 설정의 중요성( 동기화)

SigLee0505 2022. 11. 23. 08:46

오늘 알아볼 내용은 Thread의 동기화의 중요성이다.

동기화란 동기야 함께가자의 줄임말로 모든일을 의리로 해야된다는 것을 의미한다.

 

등기화란 시스템을 동시에 작동시키기 위해 여러 사건들을 조화시키는 것

 

그렇다면 동기화가 없을 때 어떻게 되는지 코드를 통해서 확인해보자.

간단하게 멀티Thread를 구현할 것이다.

각각 하나는 10회동안 계속 2를 곱해 나갈 것이고 / 하나는 계속해서 10회동안 계속 2를 나눠갈 것이다.

public class StudySynchro {

    public static void main(String[] args) throws Exception {
        Calculator cal = new Calculator();
        Runnable multi = ()->{
            for(int i = 0; i <10 ; i++ )
                cal.multi();
        };
        Runnable divide = ()->{
            for(int i = 0; i <10 ; i++ )
                cal.divide();
        };
        Thread t1 = new Thread(multi);
        Thread t2 = new Thread(divide);
        t1.start();
        t2.start();

        t1.join();			//t1 끝날떄까지 대기해!
        t2.join();			//t2 끝날떄까지 대기해!
        System.out.println("변화 결과 : "+ cal.getNum());

    }
}

class Calculator{
    private int num = 10;
    public void multi (){
        num *= 2;
        System.out.println(num);
    }
    public void divide(){
        num  /= 2;
        System.out.println(num);

    }

    public int getNum() {
        return num;
    }
}

위의 결과를 예상해 보자 

어떤 값이 나올 것같나?

개발을 배운 사람이라면 답을 알겠지만 이제 막 학습을 하는 사람들이라면

당연히 10이 나올 것이다라고 생각할 것이다.

나도 상식적으로 10번 2를 곱하고 10번 2를 나눴는데 당연한거 아니야? 라는 생각을 했다.

그러나 결과는 각각

 

0 ,2 ,4, 10

 

실행할 때마다 다르게 나왔다.

 

왜그럴까?

이는 thread가 저 공유변수에 어떻게 접근하는지를 생각해 봐야한다.

 

 thread의 작동 방식을 이해할 때는 코드를 이용하는 것보다 그림을 이용하는 것이 좋다.

 

<그림 삽입>

 

그래서 우리는 동기화가 필요한 것이다.

위의 상황에서는 동기화를 통해 위의 공유변수에 한번에 하나의 쓰레드만 접근 할 수가 있게된다.

 

 

'이전 학습 내용' 카테고리의 다른 글

오늘의 배움 코드를 쓰는 줄이 중요하다.  (0) 2022.11.25
오늘의소소한 고민 getName이 오류가 뜬 이유는?  (0) 2022.11.23
Iterator 사용 시 주의 사항(toNext())  (0) 2022.11.17
java  (0) 2022.11.17
java 02  (0) 2022.11.17