백엔드/Java
-
[Concurrency] Actor Model백엔드/Java 2024. 5. 7. 16:17
* 용어 통일을 위해 Actor, 액터 혼용 대신 Actor로만 사용했습니다. 1. 서론동시성 프로그래밍 마지막 포스팅으로 Actor 모델이다. 지금까지 내용을 정리하면 다음과 같다.Compare and Swap(CAS)단일 값에 대해 원자성을 보장해준다. 하지만 "단일 값"만이다.Software Transactional Memory(STM)트랜잭션을 진행하는 동안 다른 메모리 공간에서 공유 자원에 대한 연산을 수행한 뒤 커밋하거나 롤백하여 적용한다. Actor 모델이 대두된 시기는 역시 STM과 똑같이 멀티코어 프로그래밍으로 인해 화두가 되었다. 다만 STM과는 다르게 처음 Actor 모델을 제안한건 1973년이고, 프로그래밍 언어로 만들어진건 1986년 Erlang 언어로 Actor 모델을 기반으로..
-
[Concurrency] Software Transactional Memory (Beautiful concurrency)백엔드/Java 2024. 4. 29. 15:11
1. 서론작년엔 동시성 문제에 synchronized, 비관적 락, 낙관적 락에 대해서만 알았다가 최근에 CAS 알고리즘에 대해 알게 되었다. 이걸 기점으로 Lock-Free에 대해 더 공부하고 있다가 STM을 발견했다. 이번에 중점적으로 참고한 내용은 2007년 마이크로소프트에서 Simon Peyton Jones라는 사람이 발표한 논문이다. 내용은 Haskell 언어를 통해 어떻게 효율적인 STM을 구현할 수 있는지에 대한 내용이다.(https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/beautiful.pdf) 검색해보니 STM이라는 개념은 90년대에 있었지만, 2005년부터 인텔과 암드 주도하에 싱글 프로세스에서 멀티 프로세스로 넘..
-
[Java, Concurrency] Compare and Swap 알고리즘 (CAS)백엔드/Java 2024. 4. 14. 07:46
HashMap과 ConcurrentHashMap 차이점에 대해 공부하다가 ConcurrentHashMap의 코드를 확인해보니 Segment는 Java 8 부터는 사용되지 않아 하위호환성을 위해 남겨둔 것을 발견했다. 그러면 어떻게 안전하게 동시성 처리를 하는지 확인해보니 synchronized, 버켓(노드) 락, CAS 알고리즘을 사용하는데, CAS 알고리즘은 처음 들어봐서 정리하게 됐다. 1. synchronizedCAS 알고리즘에 대해 설명하기 전에 먼저 synchronized에 대해 알고 있어야한다.자바의 락은 모니터 개념을 사용하고 있는데, 원하는 범위만큼 하나의 스레드만 락을 획득할 수 있는 방법이다. 인스턴스의 메서드에 synchronized를 적용하면 인스턴스 메서드에 락이 걸리고, syn..
-
[Java] @BeforeAll과 static block의 차이백엔드/Java 2023. 3. 1. 09:00
책에서 메모리 구조를 공부하다가 갑자기 테스트 어노테이션을 찾아보라는 말이 나왔다. @BeforeClass를 찾아보라고 했는데, JUnit4가 @BeforeClass이고, JUnit5는 @BeforeAll을 사용한다. @BeforeAll @Target({ ElementType.ANNOTATION_TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented @API(status = STABLE, since = "5.0") public @interface BeforeAll { } - 어노테이션이나 메서드에 @BeforeEach를 붙일 수 있다. - 런타임(프로그램 종료 전까지)동안 어노테이션이 남아있다. - JavaDoc을 생성할 때..
-
[Java] Enum 내부 코드 확인하기백엔드/Java 2023. 2. 22. 08:34
사다리 미션을 하는데 리뷰어님이 Enum 내부 코드를 통해 답변을 해준 것이 기억났다. 그래서 Enum 코드를 확인하는데 다른 내부 코드들보다 만만해보여서 해석을 해보기로 했다. 전체적인 코드는 아래와 같다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 public abstract class Enum implements Comparable, Serializable { private final String name; public final String n..
-
[Java] 표준 어노테이션백엔드/Java 2023. 2. 21. 08:00
자바 코드를 보다가 내부 코드가 궁금해져서 확인해봤는데, 이런 내용의 코드가 있었다. @Test는 어떤 동작을 수행하길래 이런 어노테이션들이 붙어 있는 것일까? 그래서 찾아보니 자바의 정석을 통해 어노테이션을 정리하는 사람들이 많았다. 표준 어노테이션은 크게 두가지로 나뉜다. 하나는 어노테이션을 정의하는데 사용하는 메타 어노테이션, 하나는 일반 어노테이션이다. 이 글에서는 메타 어노테이션부터 설명한다. 1. 메타 어노테이션 오라클 공식 홈페이지 튜토리얼을 확인해보면 메타 어노테이션은 다른 어노테이션에 사용되는 어노테이션이라고 나와있다. 어노테이션을 정의하는 어노테이션이라고 생각하면 될 것 같다. [@Retension] 이 어노테이션이 들어있으면 어디까지 어노테이션 내용을 저장하는지 대한 내용을 지정할 수..
-
[Java] var는 사용해도 되는 것일까?백엔드/Java 2023. 2. 13. 00:05
자동차 경주 미션 2단계의 코드 예시에서는 var를 사용하고 있다. 자바에서 var를 보는 것은 처음이었고, 자바스크립트에서 var는 사용을 지양하라고 나와있어서 선입견 때문에 이걸 과연 사용해도 될까? 라는 생각이 들었다. 1. 자바스크립트에서 var 사용을 지양하는 이유 [호이스팅 현상] console.log(foo); undefined var foo = 1; console.log(foo); 1 자바스크립트는 변수를 설정하면 변수가 속하는 유효 범위(scope) 안에 최상단으로 올려져 선언을 하게 된다. 사실상 중간에 변수를 선언해도 최상단에 선언하는 것과 같은 효과라서 위와 같은 코드가 나와도 첫번째 줄의 console.log(foo);가 작동하게 된다. [중복 선언] var foo = 1; var..
-
[Java] final을 자주 사용하는 이유백엔드/Java 2023. 2. 12. 22:10
우테코를 진행하는데 코치님도 그렇고, 리뷰어님도 final을 자주 사용해서 왜 final을 많이 사용하는지 궁금해졌다. 내가 final을 사용하는 이유는 상수 아니면 멤버 변수에만 사용했는데, 메서드 인자에도 final을 최대한 붙이는 편이라고 해서 관련된 내용을 찾아보았다. 1. final 키워드 자바에서 final 키워드는 변수, 메서드, 클래스에 적용할 수 있다. 변수 - 단 한 번만 초기화가 가능하다. - 원시 타입에 final을 붙이면 값을 변경할 수 없다. - 객체 타입에 final을 붙이면 다른 객체로 변경하지 못하는 것이지, 객체 내부 데이터는 변경할 수 있다. - 메서드 인자에 final을 붙이면 원시 타입, 객체 타입에 따라 각각의 규칙이 적용된다. 메서드 - 상속 받은 클래스의 어떤 ..