반응형
package multi_thread.thread_synchronized;
public class Calculator {
private int memory;
public int getMemory() {
return memory;
}
public synchronized void setMemory (int memory) {
this.memory = memory;
try {
Thread.sleep(2000);
}catch(InterruptedException e) {}
System.out.println(Thread.currentThread().getName() + " : " + this.memory);
}
/* 임계구역 설정 안 한 메소드
public void setMemory (int memory) {
this.memory = memory;
try {
Thread.sleep(2000);
}catch(InterruptedException e) {}
System.out.println(Thread.currentThread().getName() + " : " + this.memory);
}
*/
}
package multi_thread.thread_synchronized;
public class User1 extends Thread{
private Calculator calculator;
public void setCalculator(Calculator calculator) {
this.setName("User1");
this.calculator = calculator;
}
public void run() {
calculator.setMemory(100);
}
}
package multi_thread.thread_synchronized;
public class User2 extends Thread{
private Calculator calculator;
public void setCalculator(Calculator calculator) {
this.setName("User2");
this.calculator = calculator;
}
public void run() {
calculator.setMemory(50);
}
}
package multi_thread.thread_synchronized;
public class MainThreadExample {
public static void main(String[] args) {
Calculator calculator = new Calculator();
User1 user1 = new User1();
user1.setCalculator(calculator);
user1.start();
User2 user2 = new User2();
user2.setCalculator(calculator);
user2.start();
}
}
스레드가 2개가 실행 될 때 동시에 같은 객체(calculator)를 이용한다면 번갈아 실행 됩니다.
User1스레드에서 calculator 에서 memory 라는 변수의 값을 100으로 바꾸고
User2스레드로 넘어가서 User2스레드에서 memory 변수 값을 다시 50으로 바꿉니다.
원래는 바로 User1스레드에서의 memory가 100일텐데 Thread.sleep이 2초로 설정되어 있기 때문에
User2스레드가 진행하면서 이미 memory값을 50으로 바꿨기 때문에 둘다 출력값이 50이 나오게 됩니다.
이러한 스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없도록 하려면 잠금을 걸어서
다른 스레드가 사용할 수 없게 해야합니다. 그 코드의 영역을 임계 영역이라고 합니다.
자바는 임계 영역을 지정하기 위해 동기화메소드와 동기화 블록을 제공합니다.
동기화 메소드를 만드는 법은 synchronized를 붙이면 됩니다.
동기화 메소드인 setMemory는 임계영역이라서 한 번에 한 스레드만 실행할 수 있고 다른 스레드는 실행할 수 없게 됩니다.
반응형
'[Java] > [Java]' 카테고리의 다른 글
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 일시 중지 또는 중지 (join() (0) | 2021.08.05 |
---|---|
[Java] 자바 멀티스레드 [Multi-Thread] 실행 대기 상태 만들기 (yield()) [실행 양보] (0) | 2021.08.04 |
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 우선순위설정하기 (0) | 2021.08.04 |
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 이름 설정하기 (setName, getName) (0) | 2021.08.04 |
[Java] 자바 멀티스레드 [Multi-Thread] (Thread) (0) | 2021.08.04 |