250x250
Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- NIO
- set
- BFS
- List
- priority_queue
- spring boot
- html
- scanner
- math
- 스프링부트
- deque
- date
- JPA
- union_find
- GC로그수집
- Union-find
- 힙덤프
- map
- alter
- Java
- 스택
- dfs
- Calendar
- string
- javascript
- Properties
- 큐
- CSS
- 리소스모니터링
- sql
Archives
- Today
- Total
매일 조금씩
Java 개념 정리 (4) - 동시성 프로그래밍 본문
728x90
반응형
동시성 프로그래밍 기초
- 동시성과 병렬성의 차이점을 말해주세요.
- 동시성은 CPU는 1개지만, 여러 개의 작업을 빠르게 번갈아가며 수행하면서 사람이 보기에 마치 동시에 하는 것처럼 보여서 부르는 용어입니다. 병렬성은 말 그대로 CPU N개가 N개의 작업을 동시에 처리하는 것을 말합니다.
- Thread-Safe하다는 것이 무슨 의미인가요?
- 멀티 스레드 환경에서 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램 실행에 문제가 없음을 뜻합니다.
- 가시성 문제와 원자성 문제에 대해 설명해 주세요.
- 가시성 문제는 여러 개의 스레드가 사용됨에 따라, CPU 캐시 메모리와 RAM의 데이터가 서로 일치하지 않아 생기는 문제를 의미합니다.
- 원자성 문제는 여러 개의 스레드가 공유 자원에 동시에 쓰기 연산을 할 경우 잘못된 결과를 반환하는 것을 의미합니다.
- 자바의 동시성 이슈를 해결하는 방법을 아는만큼 설명해 주세요.
- 가시성 문제를 해결하기 위해 volatile 키워드를 사용할 수 있고, 원자성 문제를 해결하기 위해 synchronized, atomic 키워드를 사용할 수 있습니다.
- volatile 키워드가 무엇인가요?
- CPU 캐시 메모리를 거치지 않고 RAM으로 직접 데이터를 읽고 쓰는 작업을 수행함으로써 가시성 문제를 해결하는 키워드입니다.
- synchronized 키워드가 무엇인가요?
- synchronized 키워드는 lock을 통해 동기화를 수행하여 원자성 문제를 해결하는 키워드입니다. 메소드에서 사용하거나, block 단위로 사용할 수 있습니다.
- synchronized의 문제점은 무엇이 있나요?
- synchronized는 blocking을 이용하여 동기화를 하므로, 한 스레드가 lock을 얻어서 임계 영역에 접근하면 해당 영역에 접근하고 싶은 모든 스레드가 blocking이 걸려 아무 일도 못하며 스레드 상태를 변경하는 비용때문에 성능이 좋지 않습니다.
- synchronized는 어떻게 구현되어 있나요?
- Java에서 synchronized는 모니터를 사용하여 구현됩니다. 모든 객체는 암묵적으로 모니터를 가지고 있으며, synchronized는 해당 객체의 모니터를 잠그는 역할을 합니다. 모니터는 동시성 프로그래밍에서 스레드 간의 상호 배제와 조건 동기화를 제공하는 고수준의 동기화 메커니즘으로, 한 번에 하나의 스레드만 임계 구역에 접근할 수 있도록 하여 데이터 일관성을 유지합니다.
- atomic하다는 것이 무슨 의미인가요?
- 다른 스레드의 개입이 없는 최소 단위를 말합니다. 즉, atomic 연산자는 해당 작업이 동시성 문제 없이 안전하게 실행된다는 특징이 있습니다. 대표적으로 변수 할당이 있습니다.
- atomic 타입이 무엇인가요?
- atomic 타입은 멀티 스레드 환경에서 원자성을 보장하기 위한 개념으로, CAS 알고리즘을 통해 non-blocking한 방식으로 동작합니다.
동시성 프로그래밍 심화
- 가시성 문제에 대해 조금 더 자세히 설명해 주세요. 여러 스레드가 모두 한 CPU의 캐시 메모리를 읽으면 가시성 문제가 발생하지 않을 것 같은데, 어떻게 생각하시나요?
- 스레드가 모두 한 CPU 캐시 메모리만 읽으면 괜찮으나, 스레드들이 서로 다른 CPU 캐시 메모리를 참조하게 되면 각 캐시 메모리의 불일치로 인해 동기화가 맞춰지기 전까지는 가시성 문제가 발생합니다.
- synchronized의 문제점은 무엇이 있나요?
- synchronized는 blocking을 이용하여 동기화를 하므로, 한 스레드가 lock을 얻어서 임계 영역에 접근하면 해당 영역에 접근하고 싶은 모든 스레드가 blocking이 걸려 아무 일도 못하며 스레드 상태를 변경하는 비용때문에 성능이 좋지 않습니다.
- synchronized는 어떻게 구현되어 있나요?
- Java에서 synchronized는 모니터를 사용하여 구현됩니다. 모든 객체는 암묵적으로 모니터를 가지고 있으며, synchronized는 해당 객체의 모니터를 잠그는 역할을 합니다. 모니터는 동시성 프로그래밍에서 스레드 간의 상호 배제와 조건 동기화를 제공하는 고수준의 동기화 메커니즘으로, 한 번에 하나의 스레드만 임계 구역에 접근할 수 있도록 하여 데이터 일관성을 유지합니다.
- CAS 알고리즘에 대해 설명해 주세요.
- CAS 알고리즘은 현재 스레드가 가지고 있는 기존값과 메모리가 가지고 있는 값을 비교해 같은 경우 변경할 값을 메모리에 반영하고 true를 반환합니다. 값이 다른 경우에는 변경값이 반영되지 않고 false를 반환한 다음 재시도를 하는 방식으로 동작합니다. CAS 알고리즘을 통해 가시성과 원자성 문제를 해결할 수 있습니다.
- Vector, Hashtable, Collections.SynchronizedXXX의 문제점은 무엇인가요?
- Vector, HashTable, SynchronziedXXX 클래스는 synchronized 메소드 또는 블록을 사용하며, 하나의 잠금 객체를 공유합니다. 따라서, 컬렉션에 하나의 스레드가 잠금을 획득하는 경우 다른 스레드들은 모든 메소드를 사용하지 못하고 Blocking 상태가 됩니다. 이는 애플리케이션 성능 저하의 원인이 될 수 있습니다.
- SynchronizedList와 CopyOnArrayList의 차이를 설명해 주세요.
- 전자는 읽기와 쓰기 동작시 인스턴스 자체에 잠금이 걸립니다. 하지만, 후자는 쓰기 동작 시 해당 블록에 잠금을 걸고 원본 배열에 있는 요소를 복사하여 새로운 임시 배열을 만들고, 이 임시 배열에 쓰기 동작을 수행한 후 원본 배열을 갱신합니다. 그래서 읽기 동작은 잠금 없이 바로 읽을 수 있습니다.
- ConcurrentHashMap의 동작 과정을 SynchronizedMap과 비교하여 설명해 주세요.
- SynchronizedMap은 읽기와 쓰기 동작 시 인스턴스 자체에 잠금이 걸립니다. 그러나 ConcurrentHashMap은 각 테이블 버킷을 독립적으로 잠그는 방식을 사용합니다. 만약, 빈 버킷에 노드를 삽입할 경우 잠금(Lock) 대신 CAS 알고리즘을 사용하고, 그 외의 변경은 접근한 버킷에만 잠금이 걸려 스레드 경합을 최소화하며 동시성을 보장해 줍니다. 읽기는 잠금 없이 volatile 키워드만 사용합니다.
728x90
반응형
'Java' 카테고리의 다른 글
Java 개념 정리 (5) - JVM, GC (0) | 2025.02.16 |
---|---|
Java 개념 정리 (3) - 컬렉션, 스레드 (0) | 2025.02.16 |
Java 개념 정리 (2) - 문자열, 예외, 제네릭, 람다, 스트림, 어노테이션, 리플렉션 (0) | 2025.01.09 |
Java 개념 정리 (1) - Java 기본, 객체 지향 (0) | 2025.01.09 |
Servlet 이란? Spring 에선 어떻게 사용하고 구현되는지? (0) | 2024.11.03 |