본문 바로가기
Language/Java

자바 동기화(Synchronized) 예제 및 사용방법

by wakestand 2020. 2. 24.
반응형

자바에서 동기화(Synchronized)는

여러 쓰레드에서 한 메소드를 사용 시

하나의 쓰레드만 접근 가능하게 해주는데

 

위 예제를 보면 3과 7을 4번씩 증가시켜주는

쓰레드 2개를 생성한 것이 보이는데

 

실제 실행 시 두 스레드가 동시에 increMethod를 사용하는 것이 보인다

 

여기서 여러 쓰레드가 특정 메소드를

동시에 사용하면 안되는 경우에

 

동기화를 사용해서 한 쓰레드가 특정 메소드를 사용 시

해당 쓰레드가 메소드를 끝마치기 전에는

다른 쓰레드가 메소드로 들어오지 못하게 할 수 있는데

 

사용방법은 메소드 왼쪽에 synchronized를 추가해 주면 된다

increMethod를 동기화 설정한 후에

코드를 실행해 보니

한 쓰레드가 메소드를 수행한 후에

다른 쓰레드가 들어와 메소드를 수행하는 것이 보인다

 

정리해보자면

동기화(Synchronized)란 여러 쓰레드가 한 메소드 수행 시

한번에 하나씩만 수행 가능하도록 만드는 것!

 

예제에 사용한 코드는 아래와 같다

 

class MethodClass {
	public synchronized void increMethod(int i) {
		for(int j = 0; j<5; j++) {
			System.out.println(j * i); // i * j 출력
			try {
				Thread.sleep(400); // 쓰레드가 너무 빨리 진행되서..
			} catch(Exception e) {
			}
		}
	}
}

class ThreadClass extends Thread { // 쓰레드
	MethodClass mc;
	int i;
	
	public ThreadClass(MethodClass mc, int i) {
		this.mc = mc;
		this.i = i;
	}
	
	public void run() {
		mc.increMethod(i);
	}
	
}

public class SyncExample {
	public static void main(String[] args) {
		MethodClass mc = new MethodClass();
		
		ThreadClass tc1 = new ThreadClass(mc, 3);
		ThreadClass tc2 = new ThreadClass(mc, 7);
		tc1.start();
		tc2.start();
	}
}
반응형

댓글