반응형
동기화(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 |
댓글