java는 멀티 스레드를 지원하는 언어이다. 그러다 보니 싱글 스레드에서 최적화된 접근이 있고, 멀티 스레드에서 사용하기 위한 방법도 존재한다. 여기서 멀티 스레드 환경에서 어떤 함수나 변수, 객체가 여러 스레드로부터 동시에 접근이 일어나도 프로그램 실행에 문제가 없는 Thread-safe를 고려한 자료형이 존재한다. ConcurrentHashMap이란? 멀티 스레드 환경에서도 사용할 수 있게 나온 클래스로, 동시성을 높이기 위해 나온 클래스 hashTable과 synchronized map 보다 더 나은 성능을 가지고 있다 왜냐면 concurrentHash Map 은 map의 일부에만 lock을 걸고, hashTable과 Synchronized는 map 전체에 lock을 걸기 때문 사용 예시 1 pub..
java는 멀티 스레드(Multi-Thread) 프로그래밍이 가능한 언어이다. 동시에 여러 가지 일을 할 수 있도록 하는 멀티 스레드, 그리고 스레드는 자바의 중요한 특성인데 cpu의 사용률을 높이기 위해 사용한다. 멀티 스레드 구현을 효과적으로 하기 위해 Atomic과 CAS 같은 개념이 사용된다. Atomic synchromized는 lock을 사용해 다른 스레드가 wating 하는 상황이 발생한다. 이걸 해결하기 위해 non-blocking한 방법으로 Atomic연산 사용 Atomic연산의 핵심 원리가 바로 CAS(Compare and swap)이다 atomin 자료형은 기본 자료형의 동기화를 보장해주는데 내부에서 CAS 알고리즘을 사용 atomic 변수는 멀티 스레드 환경에서 원자성을 보장해주기 ..
Given-When-Then Pattern? 코드 작성 후 이를 검증하기 위한 테스트 코드 작성 방식으로, 테스트 코드를 Given-When-Then 3구역으로 나눠서 표현하는 방식 [준비 - 실행 - 검증] 방식이라 할 수 있다. given : 입력값 / when : 어떻게 할지 행동 / then 은 결과, assert로 나타내는 간단한 패턴 방식이다. 패턴 사용 예시 @Test void hashKeyCheck() { //given HashMake hashmake = new HashMake(); hashmake.saveData(1, "lee"); hashmake.saveData(2, "aa"); hashmake.saveData(3, "lsse"); //when Object returnvalue = ha..

요즘 면접에서 많이 물어보는 질문 -> URL 입력시 어떤일이 벌어지나? 에 대한 내용이다. 전체 흐름 동작 방식 웹사이트에서 URL을 입력 URL과 일치하는 웹 서버의 IP를 찾아온다. URL은 통신을 원하는 서버의 IP주소를 가르키는 역할을 한다 IP는 기억하기 어려우나 URL같은 이름은 기억하기 쉽다! 그래서 URL을 입력하면 서버의 IP주소를 DNS에서 조회해서 찾아옴. DNS는 수많은 요청을 빠르게 처리하기 위해 임시로 데이터를 저장하는데 이걸 캐시(Cache)라 함. 그래서 URL을 입력하면 우선적으로 캐시를 확인 캐시에 없는 IP면 여러 DNS 서버에 데이터를 요청 URL뒤 [/blog] 같은 부분은 웹 서버에 메인 디렉터리 아래의 하위 폴더나 웹 페이지의 특정 파일명을 가르킨다. 이런식으로..

5월 경제 이슈로 [미국 부채한도 협상]이란 키워드가 떠오르고 있다. 경제를 공부하다 보면, 경제가 아니더라도 주식에 관심이 있으면 미국 부채한도 협상에 대해 주목해야 한다. 왜냐면 부채한도에 따라 주가의 방향이 결정되고, 세계 경제에 영향을 미치기 때문이다. 미국 부채한도 협상? 부채한도는 미국의 연방정부가 빌릴 수 있는 돈에 법적 상한을 둔 것 올해 미국은 31조 4000억 달러(약 4경 1824조 원) 규모의 부채한도를 채운 상황이며, 부채한도를 늘리기 위해서 미국 정부(현재 바이든 정부)와 미국 의회가 협상을 진행하는 중이다. 연방정부는 돈을 빌리기 위해서 채권을 발행하는데, 만약 부채한도 협상이 실패하면 채무불이행(디폴트)이 발생하게 되고 미국은 국가부도 상태가 된다. 이런 경우 채무를 갚지 못..

멀티 스레드를 잘 사용하기 위해선 동기화 문제를 해결해야 한다. Java에선 멀티 스레드를 지원하기 위한 구현체를 제공하는데 그 중 Synchronized를 사용하여 동기화와 Critical Section을 사용해보자. 멀티스레드의 동기화를 사용하지 않을 경우 멀티스레드를 구현하는 데 동기화를 사용하지 않는 예제 코드는 아래와 같다. Thread를 두 개 만들어 멀티 스레드를 구현한 다음, CountCheck의 더하기를 멀티스레드로 실행한다. Main package org.example; public class Main { public static void main(String[] args) { TaskRunnuble taskR = new TaskRunnuble(); Thread th1 = new Thr..
자바는 stack, heap, static 이라는 3개의 메모리 영역을 가지고 있다. 자바 멀티 스레드 환경은 스레드들끼리 static, heap영역을 공유하기 때문에 공유 자원에 대한 동기화 문제를 신경 써야 한다. 자바는 java.util.concurrent.lock 패키지를 통해 Lock 외의 직접 동기화 구현이 가능한 lock 구현제를 제공하는데, 여기에 Synchronized와 Reentrant 등의 클래스가 존재한다. 이 둘의 차이점은 아래와 같다. synchronized와 Reentrant 차이 Synchronized 현재 데이터를 사용하고 있는 해당 스레드를 제외한 나머지 스레드들이 데이터에 접근 불가하도록 하는 개념 자바에서 스레드 동기화 시 사용하는 대표적인 기법 synchronized..

Process & Thread & Fork Process 프로세스란? cpu에 의해 메모리에 올라가 실행 중인 프로그램 메모리 공간을 포함한 독립적인 실행 공간을 갖는다. JVM(java virtual Machine)은 하나의 프로세스로 실행되며, 동시에 여러 작업을 수행하기 위해 멀티 쓰레드를 지원한다. Thread 쓰레드란? 프로세스의 자원을 이용해 실제 작업을 수행하는 주체 java에서는 JVM에 의해 관리된다. 프로세스 안에서 한 개 이상의 쓰레드가 작업을 하는데, 1개면 단일 쓰레드, 2개 이상이면 멀티 쓰레드라 한다. 스택을 제외한 프로세스의 모든 섹션을 공유하는 경량 프로세스 thread는 fork의 비효율성을 극복하기 위해 사용 fork 프로세스를 복제하는 것으로 새로운 프로세스를 만드는 ..

github에서 [New repository] 클릭 생성한 리포지토리의 URL 복사 터미널에서 아래 명령어 입력 1. git init 2. git add . git commit -m "아무거나" git remote add origin [복사한 git URL] git remote -v git push -f origin [브런치명, 주로 master나 main] 만약 push에서 에러가 발생하면? 브런치 명을 git에서 확인해봅시다. git에서 [branch]를 클릭 왼쪽에 main이라 써있는게 브런치 이름입니다. 마음에 안들면 오른쪽에 연필아이콘으로 수정도 가능합니다.