애니메이션
총 383개 · 14 / 16 페이지 · 313–336
본문 코드 펜스로 삽입: ```anim:<id>
태그로 필터 (697)
blocking call 동안 스레드가 BLOCKED 상태로 들어가고 CPU 가 다른 스레드에 넘어갔다가, 결과가 도착하면 다시 깨어나는 전체 흐름.
BlockingQueue 가 큐가 비어 있으면 take() 가 block, 가득 차면 put() 이 block 하면서 자연스러운 backpressure 와 생산자/소비자 동기화를 제공한다.
표준 forEach 구현에서 call() 이 매 반복마다 callback 의 this 를 외부에서 지정해주는 흐름을 단계별로 보여준다.
Spring 의 CompositeMap 이 두 Map 을 하나의 view 로 통합, primary 우선 조회 후 없으면 secondary 로 폴백.
ConcurrentHashMap 의 버킷(bin) 단위 락. 다른 버킷에 접근하는 스레드는 서로 경합 없이 진행하고, 같은 버킷 충돌 시에만 그 버킷 첫 노드에 synchronized.
두 producer 가 동시에 offer 할 때 CAS 로 lock-free 하게 tail 노드를 갱신, 한 스레드의 CAS 실패는 다른 스레드의 tail 진행을 돕는 형태로 진행.
Spring 의 ConcurrentReferenceHashMap 이 key 를 WeakReference 로 감싸 GC 친화적이면서도 동시성을 유지하는 메커니즘.
여러 reader 가 lock 없이 같은 배열을 읽는 동안, writer 는 전체 배열을 복사하고 수정한 뒤 참조를 swap 한다. 읽기 lock-free, 쓰기 O(n) 복사.
main 스레드가 N 개 worker 의 작업 완료를 기다리는 패턴, 각 worker 가 countDown 호출하면 count 감소, 0 이 되면 await 깨어남.
4 개 스레드가 각 phase 의 작업을 마치고 barrier 에서 대기, 모두 도착하면 동시에 다음 phase 진행, 재사용 가능.
DelayQueue 가 각 원소의 getDelay 만료 시점을 우선순위 힙으로 관리하고, take 가 만료된 원소만 반환하며 그 외에는 시간만큼 block.
T1이 UPDATE 후 아직 COMMIT 하지 않은 상태에서 T2가 SELECT하면 미커밋 값 (dirty) 을 읽어간다. T1이 ROLLBACK 하면 T2가 읽은 값은 실존한 적 없는 유령 데이터가 된다.
PageNumberPagination (?page=N), LimitOffsetPagination (?limit=X&offset=Y), CursorPagination (?cursor=abc) 각각의 동작 방식을 비교한다.
DRF는 HTTP 요청을 dispatch → initialize_request → perform_authentication → check_permissions → check_throttles → handler → finalize_response 순으로 처리한다.
Serializer는 두 방향으로 동작한다. Model → dict → JSON (직렬화, 응답용) 과 JSON → dict → validated_data → Model (역직렬화, 요청용).
transient → managed → detached → removed 4 상태 전이. PersistenceContext 내부 변화와 DB 반영 시점을 분리해 시각화.
EAGER fetch 시 posts 1번 SELECT + 각 post 의 author 마다 추가 SELECT 발생. fetch join 으로 1쿼리에 해결.
LinkedBlockingQueue 가 putLock 과 takeLock 을 분리해 producer 와 consumer 가 동시 진행 가능한 메커니즘.
여러 스레드가 LongAdder.increment 호출 시 hash 로 다른 cell 에 분산 누적, AtomicLong 의 CAS 경합을 회피.
T1, T2가 같은 카운터를 read-modify-write할 때, 두 번 증가시켰는데 결과는 한 번만 반영된다. 원자 UPDATE, FOR UPDATE, 낙관적 lock으로 해결.
Spring 의 LinkedMultiValueMap 이 Map<K, List<V>> 위에 add 메서드를 제공해 같은 key 에 여러 값을 자연스럽게 누적.
Selector 가 준비된 소켓들만 골라주고, 단일 스레드가 그 소켓들을 차례로 non-blocking 으로 읽고 처리한 뒤 다시 select 로 돌아가는 패턴.
T1이 SELECT를 두 번 실행하는 동안 T2가 UPDATE + COMMIT을 완료하면, T1의 두 SELECT 결과가 달라진다. READ COMMITTED에서 발생.
groupby 가 데이터를 그룹으로 나누고 (split), 각 그룹에 함수 적용 (apply), 결과를 하나로 합치는 (combine) 세 단계.