오늘 알아볼 내용은 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 |