본문 바로가기
프로그래밍/JAVA

36 동기화(synchronized)

by 윤지(●'◡'●) 2021. 5. 4.
반응형

 


 

 

동기화(synchronized)

 

멀티 쓰레드 프로세스에서는 다른 쓰레드의 작업에 영향을 미칠 수 있기 때문에, 진행중인 작업이 다른 쓰레드에 간섭 받지 않게 하려면 동기화가 필요하다.

동기화를 쉽게 말하자면, 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막는 것이다.

동기화를 하려면 간섭받지 않아야 하는 문장들을 '임계 영역'으로 설정하며, 임계 영역은 락(lock)을 얻은

단 하나의 쓰레드만 출입이 가능하다.

 

 

 

 

 

 

동기화 사용 목적

 

 

1. 하나의 쓰레드가 실행중일 때 다른 쓰레드가 동시에 같은 필드를 사용하지 못하도록 막기 위해서

 

2. 쓰레드를 제어하기 위해서

- wait() : 쓰레드 대기(멈추기)

- notify() : 쓰레드 재시작(멈춘 애 다시 시작)

 

 

 

 

 

동기화 구현 방법

 

 

1. 클래스나 메소드에 synchronized 키워드를 붙여 사용한다.

public class ATM implements Runnable{/*Runnable인터페이스 지정*/
	private int money = 10000;
    
    // 메소드에 동기화 걸기
	public synchronized void withdraw(int money) {
		this.money -= money;
		System.out.println(Thread.currentThread().getName() +"이(가)"+money+"원 출금");
		System.out.println("현재잔액 : "+this.money+"원");
	}
}

 

 

 

 

2. 자원 공유 문제가 발생하는 특정 소스 코드를 synchronized 블록으로 묶는다.

public class ATM implements Runnable{/*Runnable인터페이스 지정*/
	private int money = 10000;
	
	@Override
	public void run() {
		/*
        특정 소스코드에 동기화 걸기 
	영역잡고 Alt + Shift + Z -> 6번
        mutex(run이 구현된 객체)를 전달해야하는데
        이 예시에서는 mutex가 ATM이므로 this를 전달
        */
		synchronized (this) {
			for (int i = 0; i < 5; i++) {
				withdraw(1000);
				try {Thread.sleep(500);} catch (InterruptedException e) {;}
			}
		}
	}
}

 

 

 

메인 클래스

public class CU {
	public static void main(String[] args) {
		ATM atm = new ATM();
		
		Thread mom = new Thread(atm, "엄마");
		Thread son = new Thread(atm, "아들");	//자원의 공유
	
		mom.start();
		son.start();
	}
}

 

 

엄마이(가)1000원 출금
현재잔액 : 9000원
엄마이(가)1000원 출금
현재잔액 : 8000원
엄마이(가)1000원 출금
현재잔액 : 7000원
엄마이(가)1000원 출금
현재잔액 : 6000원
엄마이(가)1000원 출금
현재잔액 : 5000원
아들이(가)1000원 출금
현재잔액 : 4000원
아들이(가)1000원 출금
현재잔액 : 3000원
아들이(가)1000원 출금
현재잔액 : 2000원
아들이(가)1000원 출금
현재잔액 : 1000원
아들이(가)1000원 출금
현재잔액 : 0원

 

 


열심히 공부하고 있지만, 오류 사항이 존재 할 수 있습니다.

수정 사항이 존재 할 경우 알려주시면 감사하겠습니다 <(__)>

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

JAVA 필수 단축키  (0) 2021.05.27
37 멀티쓰레드를 이용한 문제 풀이  (0) 2021.05.04
35 Thread  (0) 2021.05.04
34 Map 컬렉션 클래스(HashMap)  (0) 2021.04.29

댓글