Syncronized

ims·2020년 11월 23일
0

Java 정리 !

목록 보기
7/16
import java.util.*;
import java.util.function.Consumer;

public class ScratchPad {
    public static void main(String[] args) {
        Task task = new Task();

        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);
        t1.setName("t1-Thread");
        t2.setName("t2-Thread");

        t1.start();
        t2.start();
    }

}

class Account {
    int balance = 1000;

    public synchronized void withDraw(int money) {

        if (balance >= money) {
            try {
                Thread thread = Thread.currentThread();
                System.out.println(thread.getName() + " 출금 금액 ->> " + money);
                Thread.sleep(1000);
                balance -= money;
                System.out.println(thread.getName() + " balance:" + balance);

            } catch (Exception e) {
            }

        }
    }
}

class Task implements Runnable {
    Account acc = new Account();

    @Override
    public void run() {
        while (acc.balance > 0) {
            // 100, 200, 300 중의 한 값을 임의로 선택해서 출금(withDraw)한다.
            int money = (int) (Math.random() * 3 + 1) * 100;
            acc.withDraw(money);

        }
    }
}

원래는 thread가 두개가 돌아서 동시에 접근하기 때문에 마지막 결과가 -100/-200원 등이 나온다. 그러나 synchronized를 붙여주어서 동시에 접근하는 것을 막아주면 0원 아래로 떨어지는 것을 막을 수 있다.

https://coding-start.tistory.com/68

profile
티스토리로 이사했습니다! https://imsfromseoul.tistory.com/ + https://camel-man-ims.tistory.com/

0개의 댓글