multithreading
-
[Java Multithreading] Deadlock 해결 방안 2 - ReentrantLockJava/Multi Threading 기초 2022. 12. 16. 14:07
Java Multithreading 멀티스레딩의 개념과 Java에서의 활용법을 공부하고 정리하는 시리즈입니다. 안녕하세요! 오늘은 교착상태(Deadlock)을 해결하는 또 다른 솔루션에 대해 살펴보겠습니다. ReentrantLock Class 알아보기 java.util.concurrent.locks로 제공되는 ReentrantLock 클래스에 대해 살펴보겠습니다. ReentrantLock은 Lock 인터페이스의 구현체입니다. 마치 Synchronized와 같은 락을 제공하지요. 하지만 더 유용한 확장 기능을 함께 제공하고 있어요. Reentrant(재진입성) 키워드에 대한 이야기는 임계 영역과 동기화에 대해 설명하는 글 마지막에 부연설명으로 드렸던 적이 있기 때문에, 그 내용은 참고 부탁드리고요. 😇 s..
-
[Java Multithreading] Dead Lock의 네 가지 조건Java/Multi Threading 기초 2022. 12. 2. 17:30
안녕하세요! 오늘은 앞선 포스팅에 이어서 데드락에 대해 다룰 건데요. 데드락이 일어날 수 있는 조건 네 가지를 알아보겠습니다. 짧은 내용이 될 것 같네요! Dead Lock의 네 가지 조건 데드락이 일어날 수 있는 조건은 '상호 배제', '점유와 대기', '비선점 할당', '순환 대기'의 네 가지입니다. 상호 배제 : 하나의 리소스에, 한 번에 한 스레드만 접근이 가능한 상태. 점유와 대기 : 최소 하나의 스레드가 리소스를 점유하면서 다른 리소스에 대해서는 대기하는 상태. 비선점 할당 : 스레드가 자원을 사용완료해야지만 락을 회수 가능(외부 요인으로 인한 인터럽트 불가능)한 상태. 순환 대기 : 서로 다른 스레드가 서로 다른 자원에 대해 락을 가진..
-
[Java Multithreading] 동기화의 종류와 교착상태Dead LockJava/Multi Threading 기초 2022. 12. 1. 14:35
Java Multithreading 시리즈 안녕하세요 🤗 오늘은 동기화의 종류와 교착상태에 대한 예시를 이야기 해보려고 합니다.아마 익숙한 내용이 될 것 같네요! 세밀하게fine-grained 다루는 락 동기화를 하는 방법 중 가장 쉬운 건 공유 리소스 전체에 락을 거는 것입니다. 이런 방식을 세밀하다fine-grained고 표현합니다. 이에 대한 장단점은 앞선 포스팅에서 많이 다루었기 때문에 아주 간략히만 이야기 하면, 각 실행 스레드가 모든 공유 자원을 사용하는 최악의 경우에는 마치 싱글 스레드 프로그램처럼 느리게(근데 이제 컨텍스트 스위칭을 곁들인) 동작한다는 것이죠. 항상 최악의 경우로 동작하는 건 당연히 아니지만요. 성긴coarse-grained 락 다른 한 가지 방식은 공유자원 별로 락킹 하는..
-
[Java Multithreading] 경쟁상태RaceCondition와 데이터경쟁DataRaceJava/Multi Threading 기초 2022. 11. 25. 12:05
Java Multithreading 멀티스레딩의 개념과 Java에서의 활용법을 공부하고 정리하는 시리즈입니다. 앞선 글에서 경쟁 상태Race Condition와 데이터 경쟁Data Race이 계속 언급되어 왔는데요. 오늘은 두 개념의 차이에 대해 알아보겠습니다. 앞으로 한글 표기와 영문 표기는 편의에 따라 혼용하겠습니다. 경쟁 상태 Race Condition 경쟁상태의 핵심은 여러 스레드가 공유 자원에 비원자적 연산을 하는 것입니다. 실행 순서에 따라 연산의 결과값이 변할 수 있는 상태를 경쟁 상태라고 하는 것입니다. race condition을 극복하기 위해서는 앞서 살펴봤듯 race condition이 일어나는 critical section에 synchronized 블록을 지정하여 해결할 수가 있습니..
-
[Java Multithreading] 임계 영역과 동기화Java/Multi Threading 기초 2022. 10. 28. 10:34
Java Multithreading 멀티스레딩의 개념과 Java에서의 활용법을 공부하고 정리하는 시리즈입니다. 여러 스레드가 하나의 공유되는 자원에 원자성이 보장되지 않는 작업을 시도할 경우 병행성 문제가 발생한다고 지난 포스팅에서 이야기 했습니다. 오늘은 Java에서 해당 문제를 해결하는 방법 중 하나인 synchronized 키워드에 대해 이야기 해보겠습니다. method block에 정의하기 synchronized를 정의하는 두 가지 방법 중 하나는 메서드 블럭에 정의하는 것입니다. public class Counter { public int count; public Object obj; public synchronized void increase() { count++; } public synchr..
-
[Java Multithreading] 리소스 공유와 임계 영역Java/Multi Threading 기초 2022. 10. 27. 12:58
Java Multithreading 멀티스레딩의 개념과 Java에서의 활용법을 공부하고 정리하는 시리즈입니다. 이전 포스팅까지는 주로 멀티스레딩 자체에 대한 설명이나, 멀티스레딩을 통해 개선할 수 있는 부분 위주로 살펴본 것 같습니다. 그러면 이제는 멀티스레딩을 부주의하게 사용했을 때에 어떤 문제를 직면할 수 있는지 살펴보겠습니다. 꼭 new Thread 혹은 extends Thread라고 하지 않아도 웹프로그래밍을 하고 있다면 자연스럽게 멀티스레딩 환경에 있다는 것은 앞선 포스팅에서 이미 설명했고, 그리고 제가 관심을 가지고 있는 것이 바로 웹프로그래밍이기 때문입니다.😄 리소스 공유 앞서 설명한 내용을 최종적으로 정리해보겠습니다. 리소스란 말 그대로 프로그램에서 활용할 수 있는 자원을 말합니다. 현실적..
-
[Java Multithreading] 메모리 영역 - Stack과 HeapJava/Multi Threading 기초 2022. 10. 25. 13:57
Java Multithreading 멀티스레딩의 개념과 Java에서의 활용법을 공부하고 정리하는 시리즈입니다. 오늘은 멀티스레드 애플리케이션을 구현할 때 고려해야 하는 기초적인 메모리 지식에 대해 이야기 해보려고 합니다. 달리 말해 스택과 힙 이야기인데요. 각 메모리 영역의 특성과 어떤 것들을 포함하는지를 생각해 보겠습니다. Stack 스택은 각 스레드마다 생성되는 메모리 영역입니다. 이 영역에 포함되는 것은 다음과 같습니다. 호출된 메서드와 현재 실행 중인 구문을 표시하는 명령어 포인터(Instruction Pointer) 인자(argument)와 지역변수 메서드 리턴 값을 저장하기 위한 공간 메서드는 하나의 프레임으로 쌓이고 메서드에 사용되는 변수들은 해당 프레임 안에 쌓입니다. 이 하나의 프레임은 ..
-
[Java Multithreading] 성능 최적화의 두 관점 - 처리량과 http 서버Java/Multi Threading 기초 2022. 10. 24. 17:48
Java Multithreading 멀티스레딩의 개념과 Java에서의 활용법을 공부하고 정리하는 시리즈입니다. (포스팅마다 번호 매기는 건 헷갈려서 그만둘게요...) 처리량(throughput) 지난 포스팅에서는 지연시간(latency)를 줄이기 위한 전략 중 하나로 태스크를 서브태스크로 나누는 방식을 소개했습니다. 그리고 거기에는 다음과 같은 오버헤드를 고려해야 했죠. 태스크를 서브태스크로 쪼개는데 드는 비용 스레드를 생성하는 비용 start()된 스레드가 스케줄링 되기 까지의 시간 마지막 스레드가 작업을 끝내고 시그널을 보내기까지의 시간 작업을 취합할 스레드가 시작하기까지의 시간 서브태스크의 결과물을 하나로 취합하기 까지의 비용 하지만 그것은 하나의 작업을 처리하는 시간(지연시간)을 줄이기 위한 해결..