<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
이러한 스레드 간섭을 피하기 위해서는 동기화 메소드를 사용하면 된다.

10 20 30 40 50 1 2 3 4 5
synchronized 키워드를 메소드나 블록 앞에 붙이면 해당 메소드나 블록에는 한 번에 하나의 스레드만 접근할 수 있음
이를 통해 여러 스레드가 동시에 공유 자원에 접근하여 문제가 발생하는 것을 방지할 수 있음
이 기법으로 데드락이나 아사문제를 해결할 수는 없음
동일한 자원에 접근하려고 동기화를 기다리면서 대기하는 스레드들이 많아지면 자바 가상 머신이
느려지거나 일시 중단되기도 한다. 이것을 교착 상태 라고한다.
교착 상태(Deadlock)