반응형
동기화와 비동기화
- 동기화 방식은 한 자원에 대해 동시에 접근하는 것을 제한하는 방식이다.
- 다시말해서, 순서를 지키겠다는 말이다.
- 비동기화 방식은 한 자원에 대해 동시에 접근이 가능하다
동기화
- System Call이 끝날 때까지 다른 쓰레드의 접근을 막아버리는 것이다.
- 한마디로, nextLine()에서 입력을 받을 때까지 대기하는 것과 같다.
비동기화
- System Call이 왔든 말든 상관없이 계속 호출할 수 있다.
- Call Back 함수를 통해 결과를 가져온다!
* 동기화의 차이?
- 결과물을 가져오는 시점이 달라진다!!!
Java의 Synchronized 키워드
- 한마디로 Java에서의 멀티 쓰레드에서의 접근을 막는다!! 입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
class User {
private int userNo = 0;
// 임계 영역을 지정하는 synchronized메소드
public void add(String name) {
System.out.println(name + " : " + userNo++ + "번째 사용");
}
}
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 SyncThread {
public static void main(String[] args) {
User user = new User();
// 3개의 스레드 객체 생성
UserThread p1 = new UserThread(user, "A1");
UserThread p2 = new UserThread(user, "B2");
UserThread p3 = new UserThread(user, "C3");
// 스레드 스케줄링 : 우선순위 부여
p1.setPriority(p1.MAX_PRIORITY);
p2.setPriority(p2.NORM_PRIORITY);
p3.setPriority(p3.MIN_PRIORITY);
System.out.println("-----------------------");
System.out.println("sychronized 적용안한 경우");
System.out.println("-----------------------");
// 스레드 시작
p1.start();
p2.start();
p3.start();
}
}
|
cs |
// 결과
-----------------------
sychronized 적용안한 경우
-----------------------
A1 : 0번째 사용
B2 : 1번째 사용
C3 : 2번째 사용
A1 : 3번째 사용
C3 : 5번째 사용
B2 : 4번째 사용
C3 : 7번째 사용
A1 : 6번째 사용
B2 : 8번째 사용
- synchronized 키워드가 없다면... 쓰레드의 메소드 호출 순서가 꼬여버린다!!!
1
2
3
4
5
6
7
8
|
class User {
private int userNo = 0;
// 임계 영역을 지정하는 synchronized메소드
public synchronized void add(String name) {
System.out.println(name + " : " + userNo++ + "번째 사용");
}
}
|
cs |
- 똑같은 코드에 대해 synchronized를 적용시켜 보았습니다!
// 결과
-----------------------
sychronized 적용한 경우
-----------------------
A1 : 0번째 사용
C3 : 1번째 사용
B2 : 2번째 사용
A1 : 3번째 사용
B2 : 4번째 사용
C3 : 5번째 사용
A1 : 6번째 사용
B2 : 7번째 사용
C3 : 8번째 사용
- 위와 같이 호출 순서가 지켜지는 것을 볼 수 있습니다!
참고
[Java] 자바 동기화(synchronezed) 하는 방법
반응형
'Developer > Kotlin & Java' 카테고리의 다른 글
SOLID - LSP(Liskov Substitution Principle)이란? 리스코프 치환 원칙 (0) | 2019.11.22 |
---|---|
SOLID - OCP(Open Closed Principle) : 개방 폐쇄 원칙 (0) | 2019.11.17 |
SOLID - SRP(Single Responsibility Principle) : 단일책임 원칙 (2) | 2019.11.17 |
[자바] 리플렉션 - Reflection (0) | 2019.04.11 |
JVM에 대해 파해쳐보자 (0) | 2019.04.05 |