1. synchronized의 한계를 극복하기 위한 Lock 인터페이스와 ReentrantLock 클래스이전 포스팅에서 설명하였듯, synchronized 키워드를 활용한 동시성 제어는 다음의 2가지 치명적인 문제가 있었다.공정성 문제: 락의 획득 순서가 보장되지 않음무한 대기 문제: 대기하는 스레드를 깨우는 등의 제어를 할 수 없음 이런 문제를 해결하기 위해 자바 1.5부터 java.util.concurrent 라는 동시성 문제 해결을 위한 라이브러리 패키지가 추가되었다. [ 무한 대기 문제를 해결하기 위한 LockSupport 클래스 ]먼저 무한 대기 문제를 해결하기 위해 LockSupport 클래스가 추가되었다. LockSupport는 스레드를 블로킹/언블로킹하기 위한 가장 기본적인 도구로, ..
1. 동시성 제어를 위한 synchronized 키워드의 의미와 한계점[ synchronized 키워드란? ]자바 언어는 설계 초기부터 대량의 요청을 처리할 수 있도록 멀티 스레드를 염두하여 설계되었다. 이를 위해 자바는 1.0부터 손쉽게 동시성을 제어할 수 있는 synchronized 키워드를 제공하였다. synchronized 키워드를 사용하면 임계 영역의 동기화를 쉽게 구현할 수 있다. synchronized 키워드는 메서드 선언부에 붙여 사용하거나 특정 객체를 대상으로 동기화 블록을 만들어 사용할 수도 있다.public class BankAccount { private int balance = 0; // synchronized 메서드 public synchronized void d..
1. 힙 객체 헤더의 비효율과 이를 줄이기 위한 새로운 자바 객체 헤더(New Java Object Header: Compact Object Headers)[ 힙 객체 헤더의 비효율성 ]앞서 설명하였듯 자바에서 객체의 크기를 구하려면 기본적으로 객체의 헤더 크기에 변수의 크기(원시 타입인 경우) 또는 참조의 크기(참조 타입인 경우)를 더해주어야 한다. 그리고 만약 더해진 값이 8의 배수가 아니라면, 별도의 패딩 바이트를 더하여 객체의 크기가 항상 8의 배수가 되도록 보정하고 있다. Klass 포인터 압축 유무 혹은 최대 힙의 크기 등에 따라 실제 사용되는 바이트의 수가 달라질 수 있는데, 64비트 JVM을 기준으로 이를 정리하면 다음과 같다.상태마크 워드의 크기클래스 워드의 크기클래스 포인터 비압축(no..
1. JVM 내부의 힙 객체의 헤더 (Heap Object Header on JVM Internals) [ 객체의 메모리 레이아웃과 객체 헤더 ]객체의 메모리 레이아웃다음의 HotSpot JVM 객체 메모리 구조에서 보이듯이, 모든 자바 객체는 인스턴스 데이터(payload) 외에도 객체의 헤더나 정렬 패딩을 위한 메모리 공간이 존재함을 알 수 있다. 위와 같은 여러 정보들이 모여서 하나의 객체가 되는데, 그 중에서도 우리가 눈여겨볼 부분은 객체의 헤더 부분이다. 배열의 길이는 우리가 이미 알고 있기에, 그 중에서 마크 워드와 클래스 워드에 집중해서 살펴보도록 하자. 마크 워드(mark word)마크 워드(mark word)는 포인터가 아니라 그 자체로 데이터를 담고 있는 비트 필드(bit fiel..
1. Record 클래스의 개념과 도입 배경[ 개발 트렌드의 변화 ]21세기는 두말 할 필요 없이 데이터가 중심인 세상이다. 많은 데이터들이 기록되고 수치화되며, 데이터를 분석하여 얻은 결과는 수 많은 의사결정의 근거가 된다. 또한 MSA의 시대가 도래함에 따라 데이터의 교환이 점점 더 중요해지고 있다. 자바는 객체 지향 프로그래밍(OOP, Object-Oriented Programming) 언어로서, 객체를 중심으로 설계되고 개발되어 왔다. 그러나 최근 몇 년간 프로그래밍 패러다임이 변화하면서 OOP의 한계가 드러나고 있다. 특히 과거에는 장점이라고 평가받았던 객체지향 프로그래밍의 복잡한 엔티티(Entity)나 바운더리(Boundary) 등이 점점 덜 중요해지고, 순수한 데이터의 교환이 더욱 중요해지는..
