공유된 자원 중에서 동시에 사용하면 안되는 자원을 보호하는 도구

하나의 화장실에 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();
}
}

Share article