반응형
Java 멀티 쓰레드
도대체 어떻게 동시에 여러명이 접속하는 거지? 멀티 쓰레드인가? 그럼 톰캣은 멀티 쓰레드를 지원하는건가?
그럼 자바에서 멀티 쓰레드가 지원 된다는건데 알고 있는데 사용해본 적이 없기에 와닿지 않는다.
라는 의문에서 간단한게 자바 코드로 싱글톤을 활용해 멀티 쓰레드의 위험도를 직접 살펴 보았습니다.
자바에서는 Runnable 인터페이스의 run()을 구현하여 Thread 클래스로 생성하고 실행할 수 있습니다.
이 부분은 더 공부하지 않고, 멀티 쓰레드와 싱글톤의 무서움을 간단하게나마 경험하기 위함입니다.
싱글톤 클래스를 만들고 두 개의 쓰레드(유저)가 결제를 하는 코드입니다.
코드에서 보면 사용자1은 20000원을 결제 했습니다. 사용자2는 10000원을 결제 했습니다.
그럼 SingletonCustom의 price는 어떻게 될까요?
20000원이 될 수도 10000원이 될 수도 있습니다. 순서가 정해져 있는 것이 아니기 때문에 결제가 제대로 될지 안될지 알 수 없습니다.
그래서 절대로 싱글톤에는 상태값을 가지면 안되는 것 입니다.
간단하지만 이렇게 멀티 쓰레드 환경을 만들어 싱글톤을 경험 해보았습니다.
public class SingletonCustom {
private static int price = 0;
public static void buy(int sPrice) {
price = sPrice;
}
public static int getPrice() {
return price;
}
}
public class Solution {
public static void main(String[] args) {
System.out.println("main");
Runnable r1 = new Cash1();
Runnable r2 = new Cash2();
Thread t1 = new Thread(r1); // 사용자1
Thread t2 = new Thread(r2); // 사용자2
System.out.println("쓰레드 실행");
t1.start();
t2.start();
System.out.println("t1, t2가 돌고 비동기로 main 쓰레드는 계속 돔.");
System.out.println("price : " + SingletonCustom.getPrice());
}
}
class Cash1 implements Runnable {
@Override
public void run() {
SingletonCustom.buy(20000);
}
}
class Cash2 implements Runnable {
@Override
public void run() {
SingletonCustom.buy(10000);
}
}
// 결과
/*
main
쓰레드 실행
t1, t2가 돌고 비동기로 main 쓰레드는 계속 돔.
price : 10000
또는
main
쓰레드 실행
t1, t2가 돌고 비동기로 main 쓰레드는 계속 돔.
price : 20000
*/
반응형
'Java' 카테고리의 다른 글
일급 컬렉션 - 비지니스에 종속적인 자료구조 (0) | 2021.12.03 |
---|---|
커스텀 예외 클래스는 언제 사용해야 할까? (0) | 2021.12.03 |
Java로 자료구조 이해하기 5편(Map) (0) | 2021.10.16 |
Java로 자료구조 이해하기 4편(Set) (0) | 2021.10.16 |
인터페이스로 객체지향스럽게 다형성을 이용하여 중복 제거 하기 (0) | 2021.10.14 |