<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, "감소스레드");
}
}
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 |