일문일답(15)
-
[일문일답][Java] String vs StringBuilder vs StringBuffer
String String 클래스는 불변 객체이다. String 클래스의 문자열을 저장하는 char[]을 보면 final로 선언되어 있고, 해당 배열을 재할당하는 코드는 존재하지 않는다. public final class String implements java.io.Serializable, Comparable, CharSequence { /** The value is used for character storage. **/ private final char value[]; ... } 따라서 한 번 할당한 문자열을 변경하는 것은 불가능하며, 더하기 연산을 하여 문자를 이어 붙일 때는 새로운 객체가 생성되어 재할당된다. String s = "hello"; System.out.println(s.hashCode..
2022.10.30 -
[일문일답][Java] atomic type과 CAS
synchronized의 문제점 synchronized는 blocking을 사용하여 멀티 스레드 환경에서 공유 객체를 동기화하는 키워드이다. 그러나 blocking에는 여러 가지 단점이 존재하는데, 그 중에서 손 꼽는 문제는 성능 이슈이다. 특정 스레드가 해당 블럭 전체에 lock을 걸면, 해당 lock에 접근하는 스레드들은 블로킹 상태에 들어가기 때문에 아무 작업도 하지 못한 채 자원을 낭비한다. 또한 blocking 상태의 스레드를 준비 혹은 실행 상태로 변경하기 위해 시스템의 자원을 사용해야 한다. 결국 이 문제는 성능 저하로 이어진다. 이러한 문제점 때문에 non-blocking을 하며 원자성을 보장하기 위한 방법이 atomic 변수이다. 원자성과 Atomic Type atomic 변수는 멀티 스..
2022.10.29 -
[일문일답][OS] 프로세스 주소 공간
메모리 영역 1) Code(Text) 우리가 작성한 소스코드가 들어 가는 부분. 즉, 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code)영역 이라고도 부른다. 코드영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다. 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 지정돼있다. 2) Data 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다. 즉, 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장되는 영역이다. 전역변수, static 값을 참조한 코드는 컴파일 하고 나면 Data 영역의 주소값을 가리키도록 바뀐다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다. 실..
2022.09.06 -
[일문일답][OS] Race Condition
Race Condition(경쟁 상태) 여러 스레드 or 프로세스가 한정된 공유 자원에 동시에 접근하는 경우 경쟁 상태는 데이터의 불일치 문제를 야기할 수 있다. 경쟁 상태를 다루기 위해서는 동기화되어야 한다. 경쟁 상태의 예시 A와 B가 하나의 계좌에 동시에 접근해서 돈을 인출하는 경우 스레드 1과 스레드 2가 변수 x의 값을 동시에 다른 값으로 바꾸는 경우 OS에서 Race Condition이 일어나는 경우 → 주로, user mode일 때보다(일반 프로세스가 cpu를 잡고 사용할 경우) 커널 모드일 때 race condition이 일어난다. → 프로세스 간에는 주소 공간이 독립적이지만 커널 모드에서는, 커널에 있는 자원을 여러 프로세스가 공유할 수 있기 때문 1. Process가 system cal..
2022.09.06 -
[일문일답][Java] String class가 final인 이유
Java String String str1 = new String("Hello"); // new 연산자를 통한 객체 생성 String str2 = "Hello"; // 리터럴 형태로 바로 할당 Java에서 문자열 타입의 특징은 참조 타입임에도 불구하고 직접 new 연산자를 통해 객체를 생성하는 방법이 아닌, 문자열 리터럴 형태로 사용하는 것이 허용된다는 점이다. String의 불변성(Immutable) String 객체는 최초 한 번 생성되면 절대로 그 값이 변하지 않는다. String str = "최초 문자열"; str = "변경된 문자열"; str 이라는 String 객체가 생성된 이후 "최초 문자열" 을 "변경된 문자열" 로 바꾼다고 해도 실제 내부적으로는 최초 생성된 String 객체의 값이 변경..
2022.09.02 -
[일문일답][Java] Fail Fast, Fail Safe Iterator
Fail Fast , Fail Safe ? 자바에선 컬렉션 프레임워크의 하나인 Iterators(반복자)가 존재한다. 자바 컬렉션은 2가지타입의 Iterators를 지원하는데 그것이 Fail Fast, Fail Safe이다. 이러한 Iterators들은 예외처리에서 배우 유용하다. Fail Fast Iterator는 가능한 한 빨리 실패를 노출하고 전체 작업을 중지하여 작업을 중단한다. 반면, Fail Safe Iterator는 장애가 발생할 시 작업을 중단하지 않는다. 대신 가능한 한 실패를 피하려고 한다. Fail Fast iterator @Test void iteratorTest() { Map addName = new HashMap(); addName.put("Lee", "Football"); ad..
2022.08.25