Java
-
[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] DeadLock 해결 방안 1 - 순환 대기 회피Java/Multi Threading 기초 2022. 12. 15. 12:46
Java Multithreading 멀티스레딩의 개념과 Java에서의 활용법을 공부하고 정리하는 시리즈입니다. 안녕하세요! 이번 포스팅에서는 앞서 이야기했던 Deadlock이 일어나는 상황을 회피하기 위해 deadlock의 조건을 깨뜨리는 기법을 살펴보려고 합니다. 오늘 소개할 방법은 아주 간단하기 때문에, 간단한 수도코드 예제를 들어 설명을 하도록 하겠습니다. 순환 대기 (환형 대기, Circular wait) 깨뜨리기 순환 대기 상황을 코드로 설명해보겠습니다. 두 개의 수도코드가 등장합니다. // CODE 1 lock(A); lock(B); delete(A); add(B); unlock(B); unlock(A); // CODE 2 lock(B); lock(A); delete(B); add(A); un..
-
[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] 원자적 연산과 volatileJava/Multi Threading 기초 2022. 11. 10. 16:09
Java Multithreading 멀티스레딩의 개념과 Java에서의 활용법을 공부하고 정리하는 시리즈입니다. 오늘은 Java의 연산 중에서 원자성이 지켜지는 연산과 지켜지지 않는 연산을 알아보고, 비원자적 자원을 보호하는 키워드를 하나 알아보겠습니다. Java의 원자적 연산과 비원자적 연산 원자적 연산의 종류는 간단합니다. 레퍼런스의 쓰기 또는 읽기 원시타입의 쓰기 또는 읽기(double과 long 제외) 위에 적었듯이 레퍼런스를 할당하고 복사하는 모든 작업은 원자성이 보장됩니다. 원시타입 변수에 값을 쓰고 읽는 모든 작업도 마찬가지입니다. 간단하게 기억할 수 있겠죠. 그럼 예외적인 경우만 잘 다뤄보면 될 것 같은데요. 원시타입 중에서도 왜 long과 double만 제외 되는 걸까요? 32bit 안에서..
-
[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라고 하지 않아도 웹프로그래밍을 하고 있다면 자연스럽게 멀티스레딩 환경에 있다는 것은 앞선 포스팅에서 이미 설명했고, 그리고 제가 관심을 가지고 있는 것이 바로 웹프로그래밍이기 때문입니다.😄 리소스 공유 앞서 설명한 내용을 최종적으로 정리해보겠습니다. 리소스란 말 그대로 프로그램에서 활용할 수 있는 자원을 말합니다. 현실적..