면접 질문들을 모아놓은 레포를 보다 보면, 싱글톤 패턴은 많이 언급한다는 것을 알 수 있습니다. 거기서 DCL 패턴이 나오고, volatile도 나오는데요. 여기서 volatile이 무엇을 의미할까요? 먼저, 간단하게 프로그램을 작성해 보겠습니다. Main 스레드와 Worker1 스레드 하나가 있습니다. 이 프로그램은, Main Thread에서 w1의 stop flag를 중간에 true로 셋팅합니다. Worker1의 run 메소드는 그냥 stop flag가 false이면 계속 돕니다. 결과가 어떻게 나올까요? 공교롭게도, 0 : stop flag만 출력하고 더 이상 진행되지 않습니다. 이는 왜 그럴까요? 공식 문서를 보면 자세히 알 수 있습니다. Note 바로 윗 단락의 내용을 천천히 봅시다. 일단, w..
OS 검색 결과
race condition은 경쟁 상태를 의미합니다. 둘 이상의 무언가가 자원에 접근한다고 생각하면 어떨까요? 그리고 그것의 상태를 바꾸려고 한다면 어떨까요? 아래 프로그램을 보겠습니다. 리소스인 LinkedBlockingQueue가 있습니다. BlockingQueue는 쉽게 말해 동기화가 된 큐라고 생각하시면 됩니다. Executor 내부 구현에 쓰이기도 합니다. 여기에서 BlockingQueue에 대해 심도 있는 내용을 다루지 않겠습니다. 여기에서는 내부적으로 lock을 이용해서 Thread Safe 하다는 것 정도만 이해하셔도 무난합니다. Worker1은 Queue에 수를 추가합니다. 0부터 99까지 순서대로 추가를 합니다. 그리고, Worker2는 수를 뺍니다. Main 함수에서는 worker1과..
이번 시간에는 블로킹과 논블로킹에 대해서 간단하게 알아보도록 하겠습니다. 아래 코드를 생각해 보겠습니다. 문자열을 입력받고, 출력해 주는 프로그램입니다. 중요한 것은, 이 프로그램은, 제가 아무것도 입력을 하지 않으면, 입력을 받을 때 까지 대기를 한다는 것입니다. 더 정확하게 말하면, 엔터나 EOF가 들어올 때 까지 계속 입력을 받습니다. 이를 특정한 Event라고 칭하겠습니다. 이 프로그램의 순서도는 아래와 같이 그릴 수 있습니다. 이 중에서 fgets만 확대해서 그려보겠습니다. Main에서 fgets를 호출했기 때문에 Main은 caller가 되고, fgets는 Main에 의해 불려진 함수가 될 거에요. 그러면, 이 경우에는 Main으로 제어권이 넘어오지 않을 거에요. 즉, Main은 block이 ..
안녕하세요. 백준 chogahui05입니다. Vector는 ArrayList와 다르게, 주요 메서드에 synchronized가 붙은 클래스입니다. 여기서 질문 하나 드리겠습니다. 다음 코드는 어떻게 동작할까요? 쓰레드 n개를 생성했다고 해 봅시다. 그러면 이 프로그램은, 항상 비어있는 벡터를 리턴할까요? 혹은, 항상 제대로 동작할까요? vector는 ArrayList와는 다르게 주요 메서드에 동기화 처리가 되어 있습니다. 이는 StringBuilder와 StringBuffer와의 관계와도 같습니다. 전자는 동기화 처리가 되어 있지 않고, 후자는 되어 있다. 정도로 이해하시면 됩니다. 실제로, Worker 클래스의 run 메서드 안에 있는 메서드 3개를 봅시다. isEmpty는 elementCount가 0..
이 포스트를 어디에 쓸지 고민을 굉장히 많이 하였습니다. OS에 쓸지, 어셈블리 카데고리를 따로 만들어서 써야 할 지, 아니면 C언어에 쓸지. 그런데, 모 사이트에서 가장 많이 질문받은 것 중 하나가 OS의 thread (혹은 Linux의 fork)를 공부하고 있는데 왜 실행 흐름이 이렇게 되나요? 에 대한 질문이 많았습니다. 그렇기 때문에, 일단 OS 카데고리에 작성하도록 하겠습니다. 먼저, pc는 프로그램 카운터입니다. 그러면 이 값을 저장하는 것은, pc register일 거에요. 그러면 뭘 저장할까요? 실행할 기계어 코드의 주소를 저장할 거에요. 아. 벌써 모르는 용어가 3개 나온 거 같아요. 쉽게 설명해 드리겠습니다. 일단, 우리는 기계어를 명령이라고 합시다. 밥 먹어라. 혹은 설거지 해라와 같..
최근댓글