일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 네트워크
- C
- Data Structure
- 알고리즘
- Spring
- redis
- Heap
- 운영체제
- 디자인 패턴
- c언어
- 컴퓨터구조
- Algorithm
- spring webflux
- Galera Cluster
- Java
- MSA
- react
- 자바
- Kafka
- OS
- JavaScript
- 파이썬
- design pattern
- 자료구조
- mongoDB
- Proxy
- JPA
- MySQL
- 백준
- IT
Archives
- Today
- Total
시냅스
Java 프로세스 동기화 process synchronization 정리 본문
Synchronized keyword
- static과 heap을 공유하면서 동시접근이 가능한 resource 에 관하여 race condition 을 회피하기 위해 Java에서 제공하는 키워드
- 함수에 synchronized 키워드를 붙이거나 (Lock in Synchronized Methods)
- 함수에 synchronized를 걸면 함수가 포함된 해당 객체(this)에 lock을 거는 것과 동일하다.
- synchronized block을 만들어 사용할 수 있다. (Synchronized Statements)
- 필요한 부분만 lock이 걸린다.
- 객체에 lock을 거는 것은 동일하다.
- 만약 singleton 객체에 synchronized 키워드를 사용할 경우 synchronized 메소드가 많을 수록 deadlock 발생 확률이 높다
- 이를 위해 LazyHolder 방식을 사용한다.
- 내부적으로는 monitor를 이용한다.
Reentrant
- Synchronized 에서 this(객체)를 통해 Locking 하던 것을 임의의 객체를 사용하여 유연성을 주는 Class
- synchronized 의 경우 thread 의 정보를 알 수 없다
- thread가 멈췄는지
- thread가 기아상태에 빠졌는지
- 내 thread에서 해당 locking 을 들고 있는지 등
- 따라서 synchronized 구문을 만나면 해당 객체의 locking을 realese 하기까지 무한히 기다려야 된다.
- Reentrant 는 위의 상황을 피하기 위해 여러 메소드를 제공한다
- lock() : lock을 얻음
- unlock() : lock 해제
- tryLock() : 지금 즉시 상태를 확인하고 true, false를 return → true면 lock 얻음
- isHeldByCurrentThread() : 현재 thread가 lock을 갖고 있는지
- hasQueuedThread() : 해당 객체의 lock을 얻기위해 기다리는 thread가 있는지
- getOwner() : 지금 lock을 갖고 있는 thread return
- 개발자가 직접 원할 때 lock 과 unlock 을 명시해서 대기시간을 줄일 수 있다.
ReentrantReadWriteLock
- Reentrant에 Read/Write Lock 을 추가한 Class
- Read Lock : 동시에 여러 Thread 접근 가능
- Write Lock : 오직 하나의 Thread 에서만 접근 가능
- Read가 Write 보다 더 많이 수행될 것이고,
- DB의 경우 대부분은 Read 이고, Read는 Shared Lock 이 주어지고 공유 접근이 가능하다, 따라서 Thread 에서도 동시에 접근하여 처리하는 것이 효율 적일 것이다.
- 다만 Write 의 경우 자원이 변경되기 때문에 접근을 해제할 수 있어야 한다.
- 이러한 요구조건을 맞춘 클래스이다.
StampedLock
- 위의 ReentrantReadWriteLock은 구분되어있지만 여전히 Read Lock이 걸려있다면, 해제될 때 까지 Write Lock이 기다려야 한다.
- 이를 위해 StampedLock은 낙관적 읽기 lock (optimistic reading lock)을 제공한다.
- 낙관적 읽기 lock은 낙관적 읽기 도중에 Wrtie Lock에 의해 바로 풀린다.
- 따라서, 낙관적 읽기 에 실패하면 Read lock을 다시 얻어와야 한다.
- 정리하면, 무조건 read 를 위한 lock을 거는 것이 아니라, read 와 write가 충돌하는 경우에 write가 끝나고 read lock을 거는 것이다.
Condition
- condition 은 wait notify의 확장판이다.
- 조건을 추가하여 쓰레드를 구분하여 통지하기 위해 사용한다.
- 각각 쓰레드를 waiting pool 에서 따로 기다리게 하거나 호출할 수 있다.
다만, thread pool 에 들어있는 thread 들을 위의 방법만으로 관리하기에는 쉽지 않다.
따라서 Semaphore를 사용한다.
https://liltdevs.tistory.com/84
'Java, Spring' 카테고리의 다른 글
JMX 와 VisualVM 그리고 Heap dump 분석하기 (0) | 2023.02.19 |
---|---|
Java 코드로 보는 Lock Striping 과 ConcurrentHashMap, CAS (Compare-And-Swap) (2) | 2023.02.17 |
Java Equals와 HashCode, == 와 차이 (0) | 2023.02.11 |
Java Annotation Processor 정리 (0) | 2023.02.11 |
Java 가비지 컬렉션 Garbate Collection 정리 (0) | 2023.02.08 |
Comments