동기화(Synchronization)

Jan 04, 2024
동기화(Synchronization)
 
💡
공유된 자원 중에서 동시에 사용하면 안되는 자원을 보호하는 도구
 
 
notion image
 
 
하나의 화장실에 3명이 대기를 하고 있다. 화장실 변기는 여러 명이 사용할 수 없기 때문에 반드시 한 명씩 사용해야 하기 때문에 순서가 중요하다.
 

스케줄링

[스케줄링의 장점] 1. CPU 활용 극대화 2. 프로세스 처리율(시간 당 작업량)을 늘릴 수 있음
 
선입선출 방식 (Fisrt in, First out)
  • 먼저 온 순서대로 처리
  • 수행시간이 긴 작업이 있다면 대기시간이 길어짐
 
최소 작업 우선 방식(Shortest Job First)
  • 시간이 짧은 작업을 우선 처리
  • 대기 시간은 짧을 수 있으나, 수행시간이 긴 작업은 처리가 느려짐
 
라운드 로빈 스케줄링(Round-Robin)
  • 단위 시간을 쪼개서 번갈아가며 업무처리
  • 평균 처리 시간이 길어져 비효율적
 
 
 

동기화

 
스레드 간섭은 여러 개의 스레드 공유된 데이터에 동시 접근할 때 발생한다. 이러한 오류를 막는 도구를 동기화라고 한다.
 
class Account { public int balance = 1000; public void withdraw(int amount) { if (amount <= balance) { balance = balance - amount; System.out.println("출금완료" + amount); } else { System.out.println("잔액이 부족합니다."); } } } public class DeadEx01 { public static void main(String[] args) { Account account1 = new Account(); Account account2 = new Account(); new Thread(() -> { account1.withdraw(1000); }).start(); new Thread(() -> { account2.withdraw(1000); }).start(); } }
 
돈을 출금하는 코드를 만들었다. 출금은 남은 예끔 잔액을 기준으로 출금하기 때문에 잔액 이상으로 출금하게 되면 출금이 불가능하다. 하지만 운이 없어 동시에 출금이 발생하게 되면 이중 출금이 될 수 있다.
 
그래서 스레드의 동시 접근을 막기 위해 동기화를 사용한다. 동기화는 호출되는 메서드에 synchronized 만 붙이면 된다.
 
class Account { public int balance = 1000; synchronized public void withdraw(int amount) { if (amount <= balance) { this.balance = balance - amount; System.out.println("출금완료" + amount); } else { System.out.println("잔액이 부족합니다."); } } } public class DeadEx01 { public static void main(String[] args) { Account account = new Account(); Thread subThread1 = new Thread(() -> { account.withdraw(1000); }); subThread1.start(); Thread subThread2 = new Thread(() -> { account.withdraw(1000); }); subThread2.start(); } }
 
 
notion image
 
Share article

{CODE-RYU};