minuco
article thumbnail
반응형

싱글 스레드 프로그램에서는 1 개의 스레드가 객체를 독차지해서 사용하면 되지만, 멀티스레드 프로그램에서는 스레드들이 객체를 공유해서 작업해야 하는 경우가 있습니다. 이때 여러 스레드에서 동시에 한 객체에 접근할 수 있게 되면, 한 스레드에 의해 변경된 객체의 상태가 다른 스레드의 작업에 영향을 미쳐서 의도치 않은 결과를 낼 수 있습니다. 

공유 객체를 사용할 때의 주의할 점

멀티 스레드 프로그램에서 스레드들이 객체를 공유해서 작업해야 하는 경우, 스레드 A가 사용하던 객체를 스레드 B가 상태를 변경할 수 있기 때문에 스레드 A가 의도했던 것과는 다른 결과를 산출할 수도 있습니다.

 

User1 스레드가 Calculator 객체의 memory 필드에 100을 먼저 저장하고 2초간 일시정지 상태가 됩니다.

그동안에 User2 스레드가 memory 필드값을 50으로 해요. 2초가 지나 User1 스레드가 다시 실행 상태가 되어 memory 필드 값을 출력하면 User2 스레드가 저장한 50이 출력됩니다. 의도치 않은 결과가 나왔네요...

 

1. 공유객체를 작성합니다.

public class MainThreadExample {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();

        User1 user1 = new User1(); // user1 스레드 생성
        user1.setCalculator(calculator); // 공유 객체 설정
        user1.start(); // user1 스레드 시작

        User2 user2 = new User2(); // user2 스레드 생성
        user2.setCalculator(calculator); // 공유 객체 설정
        user2.start(); // user2 스레드 시
    }
}

 

2. User1 스레드

public class User1 extends Thread{
    private Calculator calculator;

    public void setCalculator(Calculator calculator){
        this.setName("User1"); // 스레드 이름을 User1로 설정
        this.calculator = calculator; // 공유 객체인 calculator 를 필드에 저장
    }

    public void run(){
        calculator.setMemory(100); // 공유 객체인 calculator 의 메모리에 100을 저장
    }
}

 

3. User2 스레드

public class User2 extends Thread{
    private Calculator calculator;

    public void setCalculator(Calculator calculator){
        this.setName("User2"); // 스레드 이름을 User2로 설정
        this.calculator = calculator; // 공유 객체인 calculator 를 필드에 저장
    }

    public void run(){
        calculator.setMemory(50); // 공유 객체인 calculator 의 메모리에 50 저장
    }
}

 

4. 메인 스레드가 실행하는 코드

public class MainThreadExample {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();

        User1 user1 = new User1(); // user1 스레드 생성
        user1.setCalculator(calculator); // 공유 객체 설정
        user1.start(); // user1 스레드 시작

        User2 user2 = new User2(); // user2 스레드 생성
        user2.setCalculator(calculator); // 공유 객체 설정
        user2.start(); // user2 스레드 시
    }
}

 

결괏값 : User2 : 50

             User1 : 50

 


오늘은 공유 객체를 사용할 때의 주의할 점에 대해서 공부해 보았습니다.

다음 시간에는 동기화 메소드를 공부해 보겠습니다. 

 

감사합니다. : )

 

 

 

출처 : 혼자 공부하는 자바, 신용권

반응형

'Android > java' 카테고리의 다른 글

스레드 (Thread) - 제어  (0) 2021.02.26
스레드 (Thread) - 동기화 메소드 (2)  (0) 2021.02.24
스레드 (Thread) 하위클래스  (0) 2021.02.21
스레드 (Thread) 란?  (0) 2021.02.18
상수  (0) 2019.03.29
profile

minuco

@minuco

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!