Java/객체지향

[객체지향][쓰레드/thread] - 쓰레드의 동기화(synchronization)

얄루몬 2022. 3. 4. 16:22

https://youtu.be/g4vP5wuAoPI?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[쓰레드의 동기화]

  • 멀티 쓰레드 프로세스에서는 다른 쓰레드의 작업에 영향을 미칠 수 있다.
  • 진행중인 작업이 다른 쓰레드에게 간섭받지 않게 하려면 '동기화'가 필요하다.
  • 동기화하려면 간섭 받지 않아야 하는 문장들을 '임계 영역'으로 설정한다.
  • 임계 영역은 락(lock)을 얻은 단 하나의 쓰레드만 출입이 가능하다. (객체 1개에 락 1개)
쓰레드의 동기화 - 한 쓰레드가 진행죽인 작업을 다른 쓰레드가 간섭하지 못하게 막는 것을 의미한다.

[synchronized를 이용한 동기화]

  • synchronized로 임계영역(lock이 걸리는 영역)을 설정하는 방법 2가지
  • 임계 영역이 많을 수록 성능이 떨어지기 때문에 최소 영역으로 임계 영역을 지정해야 한다.
package javajungsuk;

public class Java13_12 {

	public static void main(String[] args) {
		Runnable r = new RunnableEx12(); 
		new Thread(r).start();
		new Thread(r).start();	
		}
}
	
class Account {
	private int balance = 1000;
	
	public int getBalance() {
		return balance;
	}
	
	public synchronized void withdraw(int money) {
		if (balance >= money) {
			try {Thread.sleep(1000);} catch (InterruptedException e) {}
			balance -= money;
		}
	}
}

class RunnableEx12 implements Runnable{
	Account acc = new Account();
	
	@Override
	public void run() {
		while(acc.getBalance()>0) {
			int money = (int)(Math.random()* 3 + 1) * 100;
			acc.withdraw(money);
			System.out.println("balance: "+acc.getBalance());
	}
};
}
  • 쓰레드 동기화를 사용해서 통장 잔고가 음수가 나오지 않게끔 하는 코드