일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Heap
- spring webflux
- 운영체제
- 알고리즘
- Data Structure
- c언어
- redis
- JavaScript
- mongoDB
- Kafka
- OS
- Proxy
- 자료구조
- 파이썬
- 네트워크
- Galera Cluster
- JPA
- 백준
- MSA
- 자바
- design pattern
- Spring
- MySQL
- C
- 디자인 패턴
- IT
- Java
- 컴퓨터구조
- react
- Algorithm
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
뮤텍스 락, 세마포어, 모니터, 라이브니스, Mutex Locks, Semaphores, monitors, Liveness
뮤텍스 락 Mutex Locks 고급 언어에서 개발한 도구 동기화를 위한 가장 간단한 도구 2개만 가능하다. acquire()을 통해 ciritical section에 진입 허가를 받는다. (원자적 연산) release()를 통해 허가를 반납한
liltdevs.tistory.com
'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