20.03 ~ 20.08 국비교육/JAVA

Synchronized

찹키리 2020. 3. 31. 10:34

<Synchronized 동기화>

 

: 두 개 이상의 스레드가 동시에 접속하는 것을 막아준다.

-> 멀티 스레드는 동시성이 크기 때문에 실행이 꼬이는 등의 불상사를 방지하기 위해 만들어진 키워드 


1) 변수가 들어오면 입구를 틀어막는다.

 

2)변수 초기화 실행

 

3)다시 입구가 열린다.

 


-사용 범위
1)객체 변수(기본형 변수X)

 

2)함수

 

 

<예제>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
class IncThread extends Thread {
    MainData m; //클래스를 변수로, 인스턴스 변수
    int toAdd;
    String name;
 
    public IncThread(MainData md, int to, String n) {
        m = md;
        toAdd = to;
        name = n;
        System.out.println("Inc Thread m.hashCode(): " + m.hashCode());
    } // 클래스 MainData를 인자로 호출 -> call by reference
 
    public void run() {
        for(int i = 0; i < toAdd; i++) {
            try {
                sleep(5); // 결국 증/감이 번갈아 출력될 것(실행을 중지시키니까)
            } catch(Exception e) {}
            m.up(name);
        }
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

스레드1

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
class DecThread extends Thread {
    MainData m;
    int toAdd;
    String name;
    DecThread(MainData md. int to, String n) {
        m = md;
        toAdd = to;
        name = n;
        System.out.println("DecTgread m.hashCode(): " + m.hashCode());
    }
    public void run() {
        for(int i = 0; i < toAdd; i++) {
            try {
                sleep(5);
            } catch(Exception e) {}
            m.down(name);
        }
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

스레드2

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
class MainData {
    Integer data; // 기본형 데이터는 synchronized 불가
    //wrapping 클래스(=형변환 클래스)
    public void up(String name) {
        synchronized(data) { //싱크로나이즈드 블로킹
        //data라는 '변수'에 싱크로나이즈드
            data = new Integer(data.intValue() + 1);
            System.out.println(name + data + "로 증가");
        } //블로킹 해제
    }
}
    public void down(String name) {
        synchronized(data) {
            data = new Integer(data.intValue() - 1);
             System.out.println(name + data + "로 감소");
        }
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

싱크로나이즈드 클래스

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
public class UsingThread {
    public static void main(String args[]) {
        MainData m = new MainData();
        m.data = new Integer(0); //또다시 생성자 -> 객체변수기 때문에
        System.out.pritnln("UsingThread m.hashCode(): " + m.hashCode());
                                                    //실인자 hashCode
        IncThread t1;
        DecThread t2;
        t1 = new IncThread(m, 2"증가스레드");
        t2 = new DecThread(m, 3"감소스레드");
        t1.start();
        t2.start();
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

실행 클래스

 

 

*오토박싱: 객체 변수를 기본형 데이터처럼 입력해도 자동으로 wrapping해주는 기능

<-> 오토 언박싱

 

'20.03 ~ 20.08 국비교육 > JAVA' 카테고리의 다른 글

package java.lang.  (0) 2020.03.31
패키지, 패키지 간 참조  (0) 2020.03.31
스레드(Thread)  (0) 2020.03.30
예외 처리  (0) 2020.03.30
상수  (0) 2020.03.28