관심쟁이 영호

[#@.2] 자바(JAVA) - 쓰레드 ㅣ 동기화 ㅣ Synchronize 본문

학교공부/자바의 왕!

[#@.2] 자바(JAVA) - 쓰레드 ㅣ 동기화 ㅣ Synchronize

관심쟁이 영호 2020. 11. 19. 01:30
반응형

 

안녕하세요!

관심쟁이 영호입니다.

 

 


오늘은 스레드에서

동기화에 대해서 공부를 해볼 예정이에요!

 

동기화란?

그림부터 볼게요!

위에 있는 그림을 살펴보면!

 

A라는 쓰레드가 value 변수에 a를 초기화하고 a를 출력하고자 하는 의도로 출력을 했어요!

근데 중간에 B라는 쓰레드가 value변수에 b를 초기화해서

 

A 쓰레드는 b라는 값을 결국 출력하게 됩니다 ㅠ

이러한 문제를 해결하기 위해서 나온 게 동기화입니다!

 

동기화는 단 하나의 스레드만 실행할 수 있도록 별도의 조치를 해놓는 겁니다!

예를 들어 겹치는 부분을 동기화 처리를 하여 A쓰레드가 출력을 하고

동기화 처리를 한 부분을 A가 탈출하게 되면 비로소 쓰레드 B가 진입을 하여 초기화할 수 있는 겁니다!

 

좀 더 쉽게 이야기해드리자면

쓰레드 A가 진입하면서 문을 걸어 잠그고 들어간다고 생각하시면 됩니다!

잠겨있는 상태에서(쓰레드 A가 사용중일 때!) 쓰레드 B가 들어오게 된다면

쓰레드 B는 쓰레드 A가 끝날 때까지 대기를 하게 됩니다!

 

동기화 방법!

동기화는 큰 부분에서 작은 부분까지 임의로 설정할 수 있어요!

코드로 살펴볼게요!

 

class Temp{
	int value;
}

class Task extends Thread { //extends Thread!!
	
	Temp temp2;
	Task(Temp temp){
		this.temp2 = temp;
	}
	public void run() { // 쓰레드를 실행했을 때 실행되는 코드
		
		for (int i = 0; i < 10; i++) {
			temp2.value +=10;
			System.out.println("value = "+temp2.value);
		}
		
	}
}

public class threadExample {// 메인 클래스
	
	public static void main(String[] args) { 
		
		
		Temp temp = new Temp();
		Thread thread1 = new Task(temp);
		Thread thread2 = new Task(temp);
		
		thread1.start();
		thread2.start();
		

	}

}


두 개의 쓰레드를 실행했어요!

결과창을 보시면!

10씩 고르게 올라가야 하는데

중간중간에 다른 값들이 나온 것을 살펴볼 수 있습니다!

 

똑같은 value값을 공유하고 있는데

서로 간섭하게 되어 올바르게 출력이 되고 있지 않아요 ㅠㅠ

 

그럼 동기화 처리를 해보겠습니다!

 

class Temp{
	int value;
	
	synchronized void add() { //여기에 동기화 처리!
		this.value += 10;
		System.out.println("value = "+ value);
	}
}

class Task extends Thread { //extends Thread!!
	
	
	Temp temp2;
	Task(Temp temp){
		this.temp2 = temp;
	}
	public void run() { // 쓰레드를 실행했을 때 실행되는 코드
		
		for (int i = 0; i < 10; i++) {
			
			temp2.add();
		}
		
	}
}

public class threadExample {// 메인 클래스
	
	public static void main(String[] args) { 
		
		
		Temp temp = new Temp();
		Thread thread1 = new Task(temp);
		Thread thread2 = new Task(temp);
		
		thread1.start();
		thread2.start();
		

	}

}


synchronize처리를 하니까 값이 충돌되지 않고 올바르게 된 것을 볼 수 있어요!

 

오늘은 여기까지!

 

300x250
Comments