동기화

이규은·2021년 10월 18일
0

스레드

목록 보기
3/4

자바에서 동기화란 여러개의 스레드가 한 개의 자원을 사용하고자 할 때 해당 스레드만 제외하고 나머지는 접근을 못하도록 막는다.
동기화는 synchronized 식별자로 구현할 수 있다.

synchronized 사용법

// 함수에 사용
public synchronized void method() {

}

// 객체 변수에 사용
private Object object = new Object();
public void method2() {
    synchronized (object);
}

synchronized는 함수와 변수에 사용이 가능하다.

class User {
    public void add(String name) {
        System.out.println(name);
    }
}

class UserThread extends Thread {
    User user;

    UserThread(User user, String name) {
        super(name);
        this.user = user;
    }

    public void run() {
        try {
            for (int i = 0; i < 3; i++) {
                user.add(getName());
                sleep(500);
            }
        } catch (InterruptedException e) {
            System.err.println(e.getMessage());
        }
    }
}
public class SynchronizedStudy {
    public static void main(String[] args) {
        User user = new User();

        UserThread p1 = new UserThread(user, "A1");
        UserThread p2 = new UserThread(user, "B2");
        UserThread p3 = new UserThread(user, "C3");

        p1.setPriority(Thread.MAX_PRIORITY);
        p2.setPriority(Thread.NORM_PRIORITY);
        p3.setPriority(Thread.MIN_PRIORITY);

        p1.start();
        p2.start();
        p3.start();
    }
}


위와 같이 동기화를 하지 않으면 출력값이 차례대로 되지 않는 경우가 생긴다.

class User {
    public synchronized void add(String name) {
        System.out.println(name);
    }
}

class UserThread extends Thread {
    User user;

    UserThread(User user, String name) {
        super(name);
        this.user = user;
    }

    public void run() {
        try {
            for (int i = 0; i < 3; i++) {
                user.add(getName());
                sleep(500);
            }
        } catch (InterruptedException e) {
            System.err.println(e.getMessage());
        }
    }
}
public class SynchronizedStudy {
    public static void main(String[] args) {
        User user = new User();

        UserThread p1 = new UserThread(user, "A1");
        UserThread p2 = new UserThread(user, "B2");
        UserThread p3 = new UserThread(user, "C3");

        p1.setPriority(Thread.MAX_PRIORITY);
        p2.setPriority(Thread.NORM_PRIORITY);
        p3.setPriority(Thread.MIN_PRIORITY);

        p1.start();
        p2.start();
        p3.start();
    }
}

add 함수에 synchronized를 적용한 결과 차례대로 나오는 것을 알수 있다.

profile
안녕하세요

0개의 댓글