자바

[스레드] 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