누군가 JVM이 무엇인지에 대해, 그리고 정확히 어떤 역할을 하는지에 대해 물어본다면 명확하기보단 두루뭉실한 대답이 많이 나올 것만 같다. 그냥 대충 뭐.. 자바 코드 실행시키고 관리해주는거야.. 자칭 Java가 주력인 개발자이면서 JVM 위에 대충벌레가 기어다닌다는 것.. 매우 부끄러운 일이다. JVM의 정의와 하는 역할에 대해 다시 한 번 정리해보자! Java Virtual Machine (JVM) JVM은 자바 가상 머신(Java Virtual Machine)의 줄임말이다. JVM은 자바 코드를 OS 독립적으로 실행시켜줄 수 있는 매우 중요한 도구이다. OS가 무엇이든간에, 해당 OS에 맞는 JVM을 설치하기만 하면 자바 코드를 실행시킬 수 있다. 우리는 Azul, 오라클, 아마존 등의 벤더 사에..
언어
이전에 게시했던 ReentrantLock과 유사하게 자바에선 synchronized 키워드를 통해 특정 클래스 및 인스턴스에 대한 동기화를 제공한다. 개인적으론 synchronized 키워드를 직접 코드단에 사용하기보단 코어한 라이브러리들을 뜯어보며 발견한 경우가 대부분이었기에 동기화라는 키워드로 느낌만 대충 이해하고 있었다. 하지만 synchronized는 사용 방식에 따라 락 범위에 약간의 차이가 있고, 이를 이해하지 않고 사용하면 예상치 못한 문제를 만나게 될 수 있다. synchronized를 락의 관점에서 정리해보자! 1. synchronized method 아래와 같이 메서드 단위로 synchronized를 선언할 수 있다. public class SampleClass { public sync..
자바에서는 스레드 간 동기화 작업을 지원하기 위해 synchronized와 ReentrantLock을 지원한다. 그 중 ReentrantLock은 synchronized와 비교해 조금 더 유연한 락 획득 및 관리 방식을 지원하고 있다. 기본적인 작동 방식을 익혀보자. 공정한 락과 비공정한 락 ReentrantLock 인스턴스를 생성할 때는 fair 라는 인자를 설정해 락 획득을 "공정"하게 처리할지 아닐지를 설정할 수 있다. 여기서 "공정"하다는 의미는 락 획득을 대기 중인 스레드들에 대하여 가장 오래 대기한 스레드에게 먼저 락을 점유할 수 있도록 우선권을 준다는 의미이다. 생성자에서 볼 수 있다시피, fair 인자에 따라 아예 다른 인스턴스를 생성해주는 것을 확인할 수 있다. 인자가 없는 기본 생성자도..
종종 필요하지만 그때마다 매번 까먹어서 검색하게되는 동시성 검증을 위한 테스트 코드 작성법을 정리해보자. 동시성 검증 테스트 코드의 개념은 간단하다. 1. 검증하고자 하는 메서드를 별개의 스레드에서 동시에 실행시킨다. 2. 실행시킨 스레드의 모든 작업이 끝날 때까지 기다린다. 3. 결과를 확인하다. java.util.concurrent 패키지에 존재하는 클래스들을 적절히 사용하여 위 작업들을 수행할 수 있다. 책의 개수를 카운트하는 간단한 예제 코드를 만들어보자. @Service public class BookCountService { private int count; public void setCount(int count) { this.count = count; } public int getCount(..
자바는 null값을 적절하게 처리하도록 하기 위해 Optional 이라는 Wrapper 클래스를 제공한다. Optional 클래스의 기능 중 orElse() 와 orElseGet() 은 모두 Optional로 가져온 값이 null일 경우, 해당 값을 무엇으로 대체할지 결정해주는 메서드이다. 지금까지 두 메서드의 차이점을 어렴풋이만 알고 정확히는 모른 채 Supplier로 써주기 귀찮다는 이유로 orElse()를 주로 사용해왔는데, 사실은 굉장히 위험하고 생각없는 짓이었다. orElse()와 orElseGet()은 모두 Optional의 값이 null인 경우 사용자가 지정한 다른 값을 넘겨주는 용도이다. 핵심적인 차이점은 파라미터로 받는 값이 T와 Supplier라는 것이다. 이게 뭐? 라고 생각할 수 있..
매직 메소드 (Magic Method)란? 매직 메소드 혹은 스페셜 메소드라고 불리며, 메소드의 양쪽을 두 개의 언더스코어(__)로 감싼 메소드를 말한다. 일반적으로 파이썬의 클래스 내에 내부적으로 구현되어 있다. 매직 메소드를 적절히 사용하면 클래스를 보다 폭넓게 사용할 수 있고, 사용자가 직접 만든 클래스를 마치 파이썬의 내장 클래스처럼 사용할 수 있다. 아마 파이썬을 사용하며 가장 처음 접하거나 구현하는 매직 메소드는 __init__() 혹은 __str__() 일 것이다. __init__() 해당 메소드는 파이썬 클래스의 인스턴스를 생성할 때 자동으로 호출되며, 일반적으로 인스턴스 생성과 함께 인스턴스 변수를 선언하기 위해 사용된다. class Person: def __init__(self): pr..
아스키코드란? 미국정보교환표준부호(영어: American Standard Code for Information Interchange), 또는 줄여서 ASCII( /ˈæski/, 아스키)는 영문 알파벳을 사용하는 대표적인 문자 인코딩이다. 아스키는 컴퓨터와 통신 장비를 비롯한 문자를 사용하는 많은 장치에서 사용되며, 대부분의 문자 인코딩이 아스키에 기초를 두고 있다. - 위키백과 쉽게 말해 아스키코드는 알파벳을 비롯한 문자들을 통신하기 위해 일대일 대응시켜 숫자로 정해둔 코드이다. 아스키코드 테이블은 다음과 같다. 물론 이 표를 다 외우고 있을 필요는 없다. 파이썬에서는 ord()와 chr() 함수를 통해 문자를 아스키코드로, 아스키코드를 문자로 변환할 수 있다. print(ord("A")) print(o..
In CPython, the global interpreter lock or GIL is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once. The GIL prevents race conditions and ensures thread safety. CPython에서 global intertreter lock(GIL)은 멀티 스레드가 파이썬 바이트코드들을 동시에 실행시키는 것을 막으며 파이썬 object에 대한 접근을 보호하는 뮤택스이다. GIL은 경쟁상태(race condition)을 예방하고 thread-safety를 보장한다. https://wi..