일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 토비의 스프링 정리
- spring
- Real MySQL
- jvm
- redis
- GC
- 쿠버네티스
- 스트림
- Stream
- K8s
- list
- MSA
- 자바 ORM 표준 JPA 프로그래밍
- SpringBoot
- OS
- 보조스트림
- 자바
- 스프링
- JPA
- Collection
- Stack
- thread
- IntellJ
- mysql
- 이스티오
- Kotlin
- gradle
- 토비의 스프링
- 백준
- Java
- Today
- Total
목록전체 글 (153)
인생을 코딩하다.

왜 context Switching이 필요한가? 만약 컴퓨터가 매번 하나의 Task만 처리할 수 있다면, 해당 Task가 끝날때까지 다음 Task는 기다릴 수 밖에 없다. 그래서CPU가 Task를 바꿔 가며 실행하기 위해 Context Switching이 필요하게 되었다. context switching를 사용하면 멀티 프로세싱, 멀티 스레딩을 통해 빠른 속도로 응답할 수 있다. Context Switching은 "한 프로세스가 CPU를 차지하고 있을 때 우선순위가 높은 다른 프로세스가 현재 프로세스를 중지시키고 자신이 CPU를 차지할 수 있게 하는 선점형 프로세스" 방식이기 떄문에, 높은 우선순위를 가진 프로세스들이 빠른 처리를 요구하는 시스템에서 유용하다. 빠른 응답시간을 요구하는 시분할 시스템에 유..

ConcurrentHashMap의 내부구조 ConcurrentHashMap이란? ConcurrentHashMap은 Java 1.5 버전에서 HashTable의 대안으로 소개 되었다. Java 1.5 버전 이전에는 concurrent하고 multi-threaded 를 고려한 map을 구현하려면 HashTable 또는 synchronized map을 사용해야 했다. 왜냐하면 HashMap은 thread-safe 하지 않았기 때문이다. ConcurrentHashMap은 concurrent multi-threaded 환경에서 안정적으로 동작하고 HashTable과 synchronized map 보다 더 나은 성능을 가지고 있다. 그 이유는, ConcurrentHashMap은 map의 일부에만 lock을 거는데 ..

Fork Join Pool의 상속구조 java.lang.Object java.util.concurrent.AbstractExecutorService java.util.concurrent.ForkJoinPool Fork Join Pool 이란? ForkJoinPool 은 Java7부터 사용가능한 Java Concurrency 툴이며, 동일한 작업을 여러개의 Sub Task로 분리(Fork)하여 각각 처리하고, 이를 최종적으로 합쳐서(Join) 결과를 만들어내는 방식이다. 위의 그림과 같이 Fork를 통해서 업무를 분담하고 Join을 통해서 업무를 취합한다. 더 자세하게 아래 그림을 보자. 하나의 작업 큐를 가지고 있으며, 이러한 작업들을 Fork Join Pool에서 관리하는 여러 스레드에서 접근하여 작업..

FIFO구조의 일반적인 큐와는 다르게, PriorityQueue(우선순위)는 들어온 순서와 상관없이 데이터를 꺼낼 때 우선순위가 가장 높은 데이터가 가장 먼저 나온다. AbstractQueue를 상속하고 Serializable를 확장하고 있다. oracle docs의 문서를 살펴보았을때 PriorityQueue의 특징을 살펴보면, 내부구조가 heap으로 되어있다. null 값을 허용하지 않는다. 비교 불가능한 객체의 삽입도 허용하지 않는다, (실행하면 ClassCastException이 Throw 된다.) PriorityQueue 클래스와 그 반복자는 Collection 및 iterator 인터페이스의 메서드의 모든 것을 구현한다. 하지만 iterator() 메서드로 순회했을 때 순서를 보장하지 않는다...

ThreadLocal Oracla Docs에서는 ThreadLocal 클래스를 다음과 같이 설명한다. ThreadLocal 클래스는 thread-local 변수들을 제공한다. 이 변수들은 get 또는 set 메소드를 통해 접근하는 각 스레드가 독립적으로 변수의 초기화 된 사본을 가지고 있다는 점에서 다르다. ThreadLocal 인스턴스들은 보통 스레드와 상태를 연결하려고 하는 클래스들의 private static 필드들이다. (예를들어, 유저 ID 또는 트랜잭션 ID) 일반 변수의 수명은 특정 코드 블록(예, 메서드 범위, for 블록 범위 등) 범위 내에서만 유효하다. { int a = 10; ... // 블록 내에서 a 변수 사용 가능 } // 변수 a는 위 코드 블록이 끝나면 더 이상 유효하지 않..

volatile volatile란? volatile 키워드는 java 변수를 Main Memory에 저장하겠다 라는 것을 명시한다. 매번 변수의 값을 읽을 때마다 CPU cache에 저장된 값이 아닌 Main Memory에서 읽는 것이다. 또한 변수의 값을 쓸 때마다 Main Memory까지 작성한다. volatile를 쓰지 않았을 때, non-volatile일때의 문제점 멀티쓰레드 어플리케이션에서의 non-volatile 변수에 대한 작업은 성능상의 이유로 CPU 캐시를 이용한다. 둘 이상의 CPU가 탑제된 컴퓨터에서 어플리케이션을 실행한다면, 각 쓰레드는 변수를 각 CPU의 캐시로 복사하여 읽어들인다. non-volatile 변수에 대한 작업은 JVM 이 메인 메모리로부터 CPU 캐시로 변수를 읽어들..

SOLID는 객체 지향 프로그램을 구성하는 속성, 메서드 클래스, 객체, 패키지, 모듈, 라이브러리, 프레임워크, 아키텍처 등 다양한 곳에 다양하게 적용되는 것이기에 막상 SOLID가 적용됐는지 아닌지 애매모호하거나 보는 사람의 관점에 따라 다르게 해석될 수 있는 소지가 있음을 밝혀둔다. SOLID 자체는 제품이 아닌 개념이기에 그렇다. SOLID가 개념이긴 하지만 우리가 만드는 제품, 즉 소프트웨어에 녹여 내야 하는 개념이다. SOLID를 잘 녹여낸 소프트웨어는 그렇지 앟은 소프트웨어에 비해 상대적으로 이해하기 쉽고, 리팩토링과 유지보수가 수월할 뿐만 아니라 논리적으로 정연하다. SOLID는 객체 디자인 패턴의 뼈대이며, 스프링 프레임워크의 근간이 되기도 한다. SOLID를 녹여내는 소프트웨어 설계를 ..

ArrayList add() 동작방식 ArrayList는 내부에서 elementData 배열을 기반으로 구성되어 있다. 생성자를 통해서 직접 element 배열의 capacity 설정이 가능하다. 기본 Capacity는 10이다. ArrayList의 기본 생성자를 사용할 경우 elementData에 EMPTY_ELEMENTDATA (빈 Object 배열)을 할당한다. add()의 내부구조 modCount++로 구조적으로 변경된 횟수를 카운트한다. add(e, elementData, size); 위의 로직을 살펴보자. 두 번째 파라미터는 오브젝트형 배열을 인자로 받고있고, 세 번째 파라미터는 int형 정수(size)를 받고있다. s와 elementDate의 길이를 비교하여 배열의 사이즈를 조정해야 하는지 ..