<aside> 💡 동기화는 확인에는 필요없을 수 있으나 값을 변경할 경우에는 중요하다

</aside>

스레드를 사용하면 스레드 간섭이나 메모리 불일치 오류를 발생 시킬 수 있음

스레드 간섭

package ex16;

class Printer {
     void print(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class MyThread1 extends Thread {
    Printer prn;
    int[] myarr = {10, 20, 30, 40, 50};

    MyThread1(Printer prn) {
        this.prn = prn;
    }

    public void run() {
        prn.print(myarr);
    }
}

class MyThread2 extends Thread {
    Printer prn;
    int[] myarr = {1, 2, 3, 4, 5};

    MyThread2(Printer prn) {
        this.prn = prn;
    }

    public void run() {
        prn.print(myarr);
    }
}

public class TestSynchro {
    public static void main(String[] args) {
        Printer obj = new Printer();
        MyThread1 t1 = new MyThread1(obj);
        MyThread2 t2 = new MyThread2(obj);
        t1.start();
        t2.start();
    }
}
// 10 1 20 2 30 3 4 40 50 5

이러한 스레드 간섭을 피하기 위해서는 동기화 메소드를 사용하면 된다.

Untitled

10 20 30 40 50 1 2 3 4 5

synchronized 키워드를 메소드나 블록 앞에 붙이면 해당 메소드나 블록에는 한 번에 하나의 스레드만 접근할 수 있음

이를 통해 여러 스레드가 동시에 공유 자원에 접근하여 문제가 발생하는 것을 방지할 수 있음

이 기법으로 데드락이나 아사문제를 해결할 수는 없음

동일한 자원에 접근하려고 동기화를 기다리면서 대기하는 스레드들이 많아지면 자바 가상 머신이

느려지거나 일시 중단되기도 한다. 이것을 교착 상태 라고한다.

교착 상태(Deadlock)