⭐multi threading
여러 쓰레드가 동시에 수행되는 프로그래밍을 말한다.
여러 작업이 동시에 실행되는 효과를 만들 수 있다.
각각의 쓰레드는 자신만의 변수, 메서드 등 작업 공간을 가질 수 있다.
💀멀티쓰레딩 할 때의 주의점
각 쓰레드 사이에는 공유하는 자원을 가질 수 있는데
여러 쓰레드가 자원을 공유하여 작업을 수행한다면
서로 자원을 차지하려는
race condition
발생 가능🐶
이에 따라 의도하지 않은 동작이 발생시킬 수 있다.
⭐이를 해소하기 위해
동기화처리가 필요하다
How? synchronized 구문을 추가해주자
예제)
은행에서 하나의 계좌를 사용하는 연관관계 클래스(가족)들을 만들고
동기화 처리를 해봤다.
1.은행계좌클래스를 만들고 입금, 출금 메서드 작성
2.아빠, 엄마 클래스 작성
3.코드 실행부 작성
1. 은행계좌 클래스
package _thread.Bank;
/**
* 4.25 쓰레드 3강
*
* 각 쓰레드가 공유하는 자원 만들어보기
*/
public class BankAccount {
//
int money = 100_000; //초기 잔액
//getter
public int getMoney() {
return money;
}
//setter
public void setMoney(int money) {
this.money = money;
}
//method - 입금
public synchronized void deposit(int money) {
int currentMoney = getMoney();
synchronized (this) {//동기화 블록 처리
try {//예외처리
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// this.money += money;
setMoney(currentMoney + money);
System.out.println("입금후잔액: " + getMoney());
}//동기화 블록 처리
}//end of method - 입금
//method - 출금
public synchronized int withdraw(int money) {
int currentMoney = getMoney();
try {//예외처리
Thread.sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
//방어적 코드
if (currentMoney < money) {
System.out.println("잔액 부족");
return 0;
} else {
setMoney(currentMoney - money);
System.out.println("출금후잔액: " + getMoney());
return 0;
}
}//end of method - 출금
}//end of class
2. 아빠 클래스
package _thread.Bank;
/**
* 4.25 쓰레드 3강
*
* 각 쓰레드가 공유하는 자원 만들어보기
*/
public class Father extends Thread { //쓰레드 상속
//prop
BankAccount bankAccount; //연관관계
//cons
public Father(BankAccount bankAccount) {
this.bankAccount = bankAccount;
}
//method - run override
@Override
public void run() {
//계좌에 입금요청
bankAccount.deposit(10_000);
}
}//end of class Father
3. 엄마 클래스
package _thread.Bank;
/**
* 4.25 쓰레드 3강
*
* 각 쓰레드가 공유하는 자원 만들어보기
*/
public class Mother extends Thread{
BankAccount bankAccount; //연관관계
public Mother(BankAccount bankAccount) {
this.bankAccount = bankAccount;
}
@Override
public void run() {
//계좌에 출금요청
bankAccount.withdraw(5_000);
}
}//end of class Mother
4. 코드 실행부
package _thread.Bank;
/**
* 4.25 쓰레드 3강
*
* 각 쓰레드가 공유하는 자원 만들어보기
*/
public class BankAccountMainTest {
//main
public static void main(String[] args) {
//객체 생성
BankAccount bankAccount = new BankAccount();
Father father = new Father(bankAccount); // bankAccount 객체를 바라보고 있다.
Mother mother = new Mother(bankAccount);
//아빠가 입금을 요청하다
father.start(); // 작업요청 3초 지연
//엄마가 입금을 요청하다
mother.start(); // 작업요청 0.5초 지연
/*
어떻게 될까?
입금 출금을 동일한 계좌에서 처리한다.
정상적인 상황이라면
10만원 + 1만원 - 5천원 = 10만5천원으로 나와야 한다.
💀단, 멀티스레딩 프로그램에서는
race condition 상태가 걱정된다.
동시에 같은 작업을 하면?
임계영역에 걸린다
🐶의도치 않은 결과를 야기할 수 있다.
*/
}//end of main
}//end of class
멀티쓰레드 환경에서
동기화를 제대로 하지 않으면 의도치 않은 결과를 야기할 수 있다.
선언부에 synchronized 구문을 넣어 동기화 블록처리를 하면 의도된대로 코드가 실행된다.
public synchronized void deposit(int money) {
}
'Java' 카테고리의 다른 글
스윙 Swing, 자바에서 GUI를 만들어주는 도구 (0) | 2025.04.28 |
---|---|
내부 클래스 Inner Class, 논리적으로 응집력 있는 클래스 설계 (0) | 2025.04.25 |
쓰레드 Thread, 작업을 수행하는 단위 (0) | 2025.04.25 |
예외처리 Exception, 예상치 못한 상황에 대비 (0) | 2025.04.24 |
문자열 String 과 StringBuffer, 특별한 클래스 (0) | 2025.04.24 |