Table of Contents
						
						java synchronized
정의
Multi Thread 상황에서 특정 데이타의 동기화를 보장하는 키워드이다.
데이타의 안정성과 신뢰성을 보장하는 키워드이지만,
하나의 Thread 만 데이타에 접근 가능하고, 다른 Thread 는 데이타에 접근할 수 없다.
즉, 데이타에 접근하는 다른 모든 Thread 는 실행이 멈추게 된다.
사용법
메서드에서 사용
하나의 Thread 만 메소드를 호출할 수 있다.
public class TestThread {
    public static void main(String[] args) {
        TestThread thread = new TestThread();
        System.out.println("Test start!");
        new Thread(() -> {
            for (int i = 1; i <= 5; i++) {
                thread.call("Thread A");
            }
        }).start();
        new Thread(() -> {
            for (int i = 1; i <= 5; i++) {
                thread.call("Thread B");
            }
        }).start();
        System.out.println("Test end!");
    }
    public synchronized void call(String who) {
        System.out.println(who + " started.");
        try {
            System.out.println(who);
            long sleep = (long) (Math.random() * 100);
            Thread.sleep(sleep);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(who + " ended.");
    }
}
Test start!
Test end!
Thread A started.
Thread A
Thread A ended.
Thread B started.
Thread B
Thread B ended.
Thread A started.
Thread A
Thread A ended.
Thread B started.
Thread B
Thread B ended.
Thread A started.
Thread A
Thread A ended.
Thread B started.
Thread B
Thread B ended.
Thread B started.
Thread B
Thread B ended.
Thread A started.
Thread A
Thread A ended.
Thread B started.
Thread B
Thread B ended.
Thread A started.
Thread A
Thread A ended.
변수에 사용
public class TestThread {
    final Integer COUNT = 0;
    public static void main(String[] args) {
        TestThread thread = new TestThread();
        System.out.println("Test start!");
        new Thread(() -> {
            for (int i = 1; i <= 5; i++) {
                thread.call("Thread A");
            }
        }).start();
        new Thread(() -> {
            for (int i = 1; i <= 5; i++) {
                thread.call("Thread B");
            }
        }).start();
        System.out.println("Test end!");
    }
    public void call(String who) {
        System.out.println(who + " started.");
        try {
            synchronized(COUNT) {
                System.out.println(who + " COUNT started.");
                System.out.println(who);
                long sleep = (long) (Math.random() * 100);
                Thread.sleep(sleep);
                System.out.println(who + " COUNT ended.");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(who + " ended.");
    }
}
Test start!
Test end!
Thread A started.
Thread B started.
Thread A COUNT started.
Thread A
Thread A COUNT ended.
Thread B COUNT started.
Thread B
Thread A ended.
Thread A started.
Thread B COUNT ended.
Thread B ended.
Thread B started.
Thread B COUNT started.
Thread B
Thread B COUNT ended.
Thread A COUNT started.
Thread A
Thread B ended.
Thread B started.
Thread A COUNT ended.
Thread B COUNT started.
Thread B
Thread A ended.
Thread A started.
Thread B COUNT ended.
Thread A COUNT started.
Thread A
Thread B ended.
Thread B started.
Thread A COUNT ended.
Thread B COUNT started.
Thread B
Thread A ended.
Thread A started.
Thread B COUNT ended.
Thread A COUNT started.
Thread A
Thread B ended.
Thread B started.
Thread A COUNT ended.
Thread B COUNT started.
Thread B
Thread A ended.
Thread A started.
Thread B COUNT ended.
Thread B ended.
Thread A COUNT started.
Thread A
Thread A COUNT ended.
Thread A ended.