누군가 JVM이 무엇인지에 대해, 그리고 정확히 어떤 역할을 하는지에 대해 물어본다면 명확하기보단 두루뭉실한 대답이 많이 나올 것만 같다. 그냥 대충 뭐.. 자바 코드 실행시키고 관리해주는거야.. 자칭 Java가 주력인 개발자이면서 JVM 위에 대충벌레가 기어다닌다는 것.. 매우 부끄러운 일이다. JVM의 정의와 하는 역할에 대해 다시 한 번 정리해보자! Java Virtual Machine (JVM) JVM은 자바 가상 머신(Java Virtual Machine)의 줄임말이다. JVM은 자바 코드를 OS 독립적으로 실행시켜줄 수 있는 매우 중요한 도구이다. OS가 무엇이든간에, 해당 OS에 맞는 JVM을 설치하기만 하면 자바 코드를 실행시킬 수 있다. 우리는 Azul, 오라클, 아마존 등의 벤더 사에..
언어/JAVA
이전에 게시했던 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라는 것이다. 이게 뭐? 라고 생각할 수 있..