자바
[스레드] 4. 동기화 메소드와 동기화 블록
devjones
2022. 4. 24. 13:07
예제1
package test;
/*
공유 객체를 사용할 때의 주의할 점
- 멀티 스레드가 하나의 객체를 공유해서 생기는 오류
동기화 메소드 및 동기화 블록 - synchronized
- 단 하나의 스레드만 실행할 수 있는 메소드 또는 블록.
- 다른 스레드는 메소드나 블록이 실행이 끝날 때까지 대기.
*/
public class Main {
// 동기화 메소드
public synchronized void method1() {
// 임계 영역; -- 단하나의 스레드만 실행
}
// 동기화 블록
synchronized (/*공유객체*/) {
// 임계 영역; -- 단하나의 스레드만 실행
}
public static void main(String[] args) {
}
}
예제2: 동기화되지 않은 메소드
package test;
public class Calculator {
private int memory;
public int getMemory() {
return memory;
}
public void setMemory(int memory) {
this.memory = memory;
// 스레드를 2초간 잠금
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread().getName() + " : " + this.memory);
}
}
package test;
public class User1 extends Thread {
private Calculator calculator;
public void setCalculator(Calculator calculator) {
this.setName("User1");
this.calculator = calculator;
}
@Override
public void run() {
calculator.setMemory(100);
}
}
package test;
public class User2 extends Thread {
private Calculator calculator;
public void setCalculator(Calculator calculator) {
this.setName("User2");
this.calculator = calculator;
}
@Override
public void run() {
calculator.setMemory(50);
}
}
package test;
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();
}
}
결과:
User2 : 50
User1 : 50
예제3: 동기화 메소드 setMemory
public synchronized void setMemory(int memory) {
this.memory = memory;
// 스레드를 2초간 잠금
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread().getName() + " : " + this.memory);
}
결과:
User1 : 100
User2 : 50