쓰레드를 사용하다보면 여러개의 쓰레드를 생성했을때 생기는 문제점들이있다
예를 들어 내가 은행계좌라는 클래스를 만들어 money를 저장하고
두개의 쓰레드를 생성하여 하나는 돈을 입금하고 하나는 돈을 출금한다고 생각해보자
과연 어떻게될까?
알아보기 위해 코드를 작성해보자
우선 돈을 입금하는 father 클래스와 돈을 출금하는 mother 클래스를 만들어보자
두 클래스 모두 쓰레드 클래스를 상속하여 런 메소드만 재정의 해보았다
이제 은행계좌 클래스를 만들어보자
입금메소드가 호출될시 겟터메소드와 셋터메소드를 활용하여 돈이 늘어나게끔 설계해보았다
입금과 출금에 sleep의 편차를 두어 출금이 먼저되도록 설계해두었다
이제 메인 메소드로 출력을 해보자
우리가 원하는 출력은 5천원이 먼저빠지고 만원이 입금되어 10만 5천원이되는게 목표다
하지만 예상과는 다르게 5000원이 빠진후 원래있던 100000원에서 10000원이 추가된것을 확인할수있다
쓰레드는 순서를 정하지않을경우 서로의 계산결과에는 무관하게 각자의 계산처리만 하는것같다
이를 해결하기 위해서 동기화 (synchronization)기능을 활용해보자
synchronization에는 두가지 방법이있는데
첫번째는 메소드의 데이터형 앞에 붙여주는것이다
두번째 방법은 synchronized 블락을 생성해 해당 구역만 락을 거는것이다
이렇게 동기화 기능을 사용하면 쓰레드가 하나씩 차례대로 수행하게된다
즉 첫번째 쓰레드가 입금처리를 한 후 그 결과에서 다른쓰레드가 일을 이어서 하게 된다
이제 메인클래스에서 결과를 확인해보자
'Java' 카테고리의 다른 글
배열을 활용하여 객체 만들기 (0) | 2024.05.21 |
---|---|
자료구조 (1) | 2024.05.07 |
Thread (0) | 2024.05.05 |
예외 처리 (0) | 2024.05.02 |
Object 클래스 (1) | 2024.04.29 |