자바의 스레드 동기화

mDev_97·2022년 1월 28일
0

Java

목록 보기
28/28
post-thumbnail

스레드 동기화

• Thread Stnchronization
공유 데이터에 대한 멀티스레드의 동시 접근 문제의 해결책
-> 한 스레드의 공유 데이터 작업이 끝날 때까지 다른 스레드는 대기
• 다수의 스레드가 공유 데이터를 배타적으로 접근하기 위해 상호 협력하는 것

※ 다수의 스레드가 공유 데이터에 동시에 접근할 경우 예상치 못한 결과가 발생할 수 있다.

스레드 동기화 방법

1. synchronized로 동기화 블록 지정

synchronized 키워드

• 한 스레드가 독점적으로 실행해야 하는 동기화 코드를 표시
• 메소드 전체 또는 코드 블록에 사용

synchronized 블록에 대한 컴파일러의 처리

  1. 먼저 실행한 스레드가 해당 객체를 독점적으로 사용하는 권한을 소유

  2. 먼저 실행한 스레드가 사용 권한을 포기할 때까지 다른 스레드들은 대기한다.

사용 예제

class Board { // 공유 데이터 역할의 Board
    private int sum = 0;
    synchronized public void add() {
        int n = sum;
        Thread.yield(); // 현재 실행 중인 스레드 양보
        n += 10;
        sum = n; // 증가한 값 sum에 대입
        System.out.println(Thread.currentThread().getName() + " : " + sum);
    }
    
    public int getSum() {
        return sum;
    }
}

class PersonThread extends Thread {
    private Board board;
    
    public PersonThread(String name, Board board) {
        super(name);
        this.board = board;
    }
    
    @Override
    public void run() {
        for(int i=0; i<5; i++) {
            board.add();
        }
    }
}


public class ThreadSyncEx {
    public static void main(String[] args) {
        Board board = new Board();
        // 사람1과 사람2가 board를 같이 사용
        // 사람1, 사람2가 각각 5번씩 add() 메소드를 호출
        Thread thread1 = new PersonThread("사람1", board);
        Thread thread2 = new PersonThread("사람2", board);

        thread1.start(); // thread1 시작
        thread2.start(); // thread2 시작
    }
}

• 실행 결과

사람1 : 10
사람1 : 20
사람1 : 30
사람1 : 40
사람1 : 50
사람2 : 60
사람2 : 70
사람2 : 80
사람2 : 90
사람2 : 100

2. wait() - notify() 메소드로 실행 순서 제어

• 동기화 객체 : 두 개 이상의 스레드의 동기화에 사용되는 객체

동기화 메소드

• Object 메소드이다.
-> 모든 객체가 동기화 객체로 가능
-> Thread 객체도 동기화 객체로 사용 가능

wait() : 다른 스레드가 notify()를 호출할 때까지 대기

notify() : 대기 중인 스레드를 RUNNABLE 상태로 만든다. 한 개의 스레드만 깨움

notifyAll() : 대기 중인 모든 스레드를 RUNNABLE 상태로 만든다. (synchronized 블록 내에서만 사용)

profile
안녕하세요. 백엔드, 클라우드, 인프라에 관심과 열정이 있는 김문성입니다. 😊

0개의 댓글

관련 채용 정보