Java 15에 Biased Locking이 deprecate 된다.

최근 릴리스된 Java 15 버전의 new feature를 보다가 깜짝 놀람.


JEP 374: Disable and Deprecate Biased Locking


Biased locking은 실제로는 synchronized를 통해 lock을 쓰고 있으나 single thread에서 실행되는 경우가 더 많다고 가정하여 이 경우는 lock 오버헤드 없이 실행되도록 자바의 내부 스택에 상태 필드를 유지하는 방식의 최적화이다.
기존 JDK의 util 클래스들이 기본적으로 synchronized를 하도록 구현되어 있었기 때문인데 그후 sync 없는 클래스들이 API에 대부분 추가되었다. 하지만 여전히 java.io 패키지의 스트림 클래스들은 그대로이긴 한데 실제로는 IO를 하지 않는 ByteArray...Stream 같은 류는 biased locking의 여전한 수혜자이고 예전 API 기반으로 설계되어 Hashtable, Vector, Properties 같은 클래스를 인자로 받는 경우도 마찬가지이다.
물론 biased locking은 contention이 발생할 때에는 오버헤드가 있다.
이런 낙관적 최적화는 어느쪽이 더 전형적이냐가 분명할 때 효과가 있다.
Java 15에서 biased locking을 제거하면 기존 코드들 중 이건 biased locking 덕분에 큰 차이가 없어 하고 넘어갔던 코드들이 모두 영향을 받을 것이다. 
15년 가까이 biased locking을 전제로 decision을 했던 터라 
약간 난감하다. 물론 가능하면 StringBuilder,ArrayList 등을 쓰는 건 당연했지만 약간 API적으로 선택이 모호한 경우에는 biased locking을 고려하여 lock free 모듈을 만들지 않고 넘어갔던 경우가 계속 떠오른다. (ByteArray stream 같은 경우는 별도로 Lite 클래스를 만들어 쓰긴 했지만 항상 그럴 수 있었던 건 아니다)
제거를 결정한 근거는 대부분 코드들이 lockfree new API로 옮겨갔다는점과 contention이 많은 ThreadPoolExecutor 같은 코드에서 오버헤드가 꽤 크다는 점을 들고 있다. 공감한다.

다만 약간 뒷골이 당기는 느낌이 있다. ㅠㅠ

수많은 decision들을 되돌릴 수도 없고...


댓글

이 블로그의 인기 게시물

[Java] Java G1 GC의 특성에 따른 Full GC 회피 튜닝 방법

엄밀한 사고(Critical Thinking)란 무엇일까

일론 머스크의 First Principle Thinking (제1원리 기반 사고)