Thread.join()을 이용한 Thread 실행 순서 제어 (Race Condition)
📘 Backend/Concurrency2023. 10. 2. 16:57Thread.join()을 이용한 Thread 실행 순서 제어 (Race Condition)

📘 Thread.join()을 이용한 실행 순서 제어 다른 스레드를 시작하고 멈추는 기능 그 이상에 대해 알아보겠습니다. 특히, 신뢰하는 스레드가 예상 시간 안에 작업을 완료하게 만드는 법을 배울 겁니다. 그러려면 스레드 실행을 완전히 제어할 수 있어야 합니다. 그렇게 특정 작업들을 병렬로 실행하고 처리 속도를 높이면 안전하고 정확하게 결과를 출력할 수 있습니다. 앞서 알아본 것처럼 스레드를 실행하면 독립적으로 동작하며, 스레드의 실행 순서 역시 개발자가 제어할 수 없습니다. 하지만, join()을 이용해 특정 스레드의 작업 완료 시, 다음 스레드를 실행하게 할 수 있습니다. 동시에 시작하는 두 스레드 A,B를 예시로 들어서 예측할 수 있는 결과는 아래와 같습니다. A가 B보다 먼저 작업을 완료한다. B..

Thread Termanation - Thread Interrupt & Daemon Thread
📘 Backend/Concurrency2023. 10. 2. 15:57Thread Termanation - Thread Interrupt & Daemon Thread

📘 Thread Coordination 이번에 배워볼 건 스레드를 조정하는 방법입니다. 그 중 하나의 스레드를 다른 스레드에서 멈추게 하는 작업 (Thread Termination)이죠. 이 Thread Termination에는 몇가지 방법이 있습니다. interrupt() 를 사용하는 방법 Daemon Thread를 사용하는 방법 📌 스레드를 언제/왜 멈춰야 할까요? 스레드는 아무 동작을 안해도 메모리와 일부 커널 리소스를 사용합니다. 그리고 CPU 타임과 CPU 캐시 공간도 사용합니다. 따라서 생성한 스레드가 이미 작업을 완료했는데 어플리케이션이 동작중이라면 미사용 스레드가 잡아먹는 리소스를 정리해야 합니다. 또, 스레드가 오작동 할 시에도 스레드를 중지해야 합니다. 예를 들어 응답이 없는 서버에 계..

Thread Inheritance (경찰과 도둑 예시)
📘 Backend/Concurrency2023. 10. 2. 13:47Thread Inheritance (경찰과 도둑 예시)

📘 Thread 상속 하나의 예시를 들어, 돈을 보관할 안전한 금고를 설계한다고 가정해 봅시다. 그리고 해커들이 코드를 추측해서 금고를 여는데 얼마나 걸리는지 알아보겠습니다. 동시에 금고의 코드를 깨려는 헤커 스레드를 몇개 만들고, 경찰 스레드도 추가합니다. 경찰 스레드는 10초 안에 해커를 잡으러 옵니다. 만약 해커들이 그동안 돈을 훔쳐서 도망가지 않는다면 경찰이 해커를 체포합니다. 10초를 세는동안 경찰 스레드는 도착 상황을 화면에 띄워 보여줄 겁니다. 위 예시의 계층을 정리해 보자면, 최상위 Runnable 인터페이스 Runnable을 구현한 Thread Thread를 확장한 Hacker Thread / Police Thread (이때, Hacker Thread는 금고 객체에 대한 Referense..

Create Thread - Implementation Runnable & Thread
📘 Backend/Concurrency2023. 10. 2. 13:45Create Thread - Implementation Runnable & Thread

📘 Thread Creation with Runnable Runnable 인터페이스를 구현해 Multi-Threading을 구현합니다. 아래 예시 코드의 new Thread(() -> {}) 람다 부분은 내부적으로 new Runnable()로 구성됩니다. 📌 start() & sleep() 아래 코드를 실행시켜 보면, 당연히 처음 로그는 main 스레드에서 생성했으니 이름이 main 입니다. 그 후, thread.start()를 거친 후의 thread name은 운영체제에서 스케줄링 되지 않았습니다. 왜냐하면 sleep으로 인해 운영체제가 비동기적으로 sleep을 실행했고, 그래서 2번쨰 스레드의 이름이 테스트-1이 아닌 main이 나오게 됩니다. 그리고 마지막으로 새 스레드의 코드가 실행되어 테스트-1..

Java Serializable & Parsing
📘 Backend/Java2023. 10. 2. 00:08Java Serializable & Parsing

📘 Serialization vs JSON 비교 직렬화를 알아보게 된 계기는 CSV, JSON 같은 훌륭한 데이터 포맷이 있는데 왜 굳이 직렬화를 사용하는지 입니다. 직렬화란 자바 Object & Data를 다른 컴퓨터의 자바 시스템에서 사용 하도록 바이트 스트림(streams of byte) 형태로, 연속적인(Serial) 데이터로 변환하는 포맷 변환 기술입니다. 반대로 역직렬화는 바이트로 변환된 데이터를 원래대로 자바 시스템의 Object & Data로 변환하는 기술입니다. 이를 시스템적으로 보면 JVM의 Heap or Stack 메모리에 상주하는 객체를 직렬화해 DB나 외부 저장소에 저장하고, 다른 컴퓨터의 자바 시스템에서 이 파일을 역직렬화 하여 자바 객체르 변환 후 JVM 메모리에 적재시켜 사용..

Spring RestTemplate
📘 Backend/Spring2023. 10. 1. 21:16Spring RestTemplate

📘 Spring RestTemplate 참고한 블로그 HTTP 프로토콜을 사용하여 Rest API에 쉽게 액세스 할 수 있게 해주는 스프링 프레임워크의 클래스입니다. GET, POST, PUT, DELETE 등의 HTTP Method를 지원하며, 서버로 부터 응답을 받을때 JSON, XML등 다영한 포맷 형식을 지원합니다. WebCllient vs RestTemplate WebClient는 Web Flux에서 제공하는 Reactor를 이용한 비동기 & 논블로킹 방식을 사용하여 데이터를 주고 받는 반면, Spring WebClient와 비교하여 차이점이 있다면, RestTemplate는 HTTP 요청에 대해 동기식 & 블로킹하여 데이터를 주고 받습니다. 📘 HTTP Request & Response에 대한..

⚙️ Ops/CS2023. 9. 29. 16:31Context Switching & Thread Scheduling

📘 Process 구조 운영체제에서 모든 프로그램은 실행을 하면 메모리로 올라와서 프로세스로 올려집니다. 📌 프로세스의 구조 MetaData (PID, Mode, Priority ... 등등) Data(Heap) Files Code MainThread (Stack, Instruction Pointer) Stack은 메모리 영역으로 지역 변수가 저장되고 기능이 실행되는 영역입니다. Instruction Pointer는 스레드가 실행할 다음 명령어 주소의 포인트 역할만 합니다. 프로세스의 Stack, Instruction 부분만 제외하면 나머지 모든 스레드들이 MetaData, Data, Files, Code를 공유합니다. 📘 Context Switching 각각의 어플리케이션과 프로세스는 독립적으로 실행됩..

image