race condition은 경쟁 상태를 의미합니다. 둘 이상의 무언가가 자원에 접근한다고 생각하면 어떨까요? 그리고 그것의 상태를 바꾸려고 한다면 어떨까요? 아래 프로그램을 보겠습니다. 리소스인 LinkedBlockingQueue가 있습니다. BlockingQueue는 쉽게 말해 동기화가 된 큐라고 생각하시면 됩니다. Executor 내부 구현에 쓰이기도 합니다. 여기에서 BlockingQueue에 대해 심도 있는 내용을 다루지 않겠습니다. 여기에서는 내부적으로 lock을 이용해서 Thread Safe 하다는 것 정도만 이해하셔도 무난합니다. Worker1은 Queue에 수를 추가합니다. 0부터 99까지 순서대로 추가를 합니다. 그리고, Worker2는 수를 뺍니다. Main 함수에서는 worker1과..
OS/이론 검색 결과
스레드를 다룰 때 까다로운 것 중 하나는 lock이 대체 의도치 않게 어디에 걸렸지? 일 겁니다. 링크에서도 다루고 있으니, 한 번 정도는 읽어보셔도 도움이 많이 되실 듯 싶습니다. 먼저, 예제 프로그램 1을 보겠습니다. worker1과 worker2는 간단한 일을 합니다. 5초동안 sleep을 하고 끝냅니다. 그리고, 5번째 줄과 15번째 줄에, na가 가리키고 있는 객체에 lock을 겁니다. 즉, lock을 거는 대상은, Worker1의 na가 가리키는 Object, Worker2의 na가 가리키는 Object입니다. 다음에 Main 클래스는 그냥 Worker1과 Worker2를 돌리고, 끝날 때 까지 기다린 다음에, 프로그램이 끝날 때 까지 걸린 시간을 측정합니다. 이게 다입니다. 위 프로그램의 실..
이번 시간에는 블로킹과 논블로킹에 대해서 간단하게 알아보도록 하겠습니다. 아래 코드를 생각해 보겠습니다. 문자열을 입력받고, 출력해 주는 프로그램입니다. 중요한 것은, 이 프로그램은, 제가 아무것도 입력을 하지 않으면, 입력을 받을 때 까지 대기를 한다는 것입니다. 더 정확하게 말하면, 엔터나 EOF가 들어올 때 까지 계속 입력을 받습니다. 이를 특정한 Event라고 칭하겠습니다. 이 프로그램의 순서도는 아래와 같이 그릴 수 있습니다. 이 중에서 fgets만 확대해서 그려보겠습니다. Main에서 fgets를 호출했기 때문에 Main은 caller가 되고, fgets는 Main에 의해 불려진 함수가 될 거에요. 그러면, 이 경우에는 Main으로 제어권이 넘어오지 않을 거에요. 즉, Main은 block이 ..
hashMap은 동기화가 된 클래스가 아닙니다. 그렇기 때문에, 두 Thread에서 같은 hashMap에 동시에 접근했을 때, 문제가 발생할 수 있습니다. 둘 다 write 연산을 수행할 때에도 문제가 발생할 겁니다. 그런데, 왜 문제가 될까요? 문제가 되는 시나리오가 없을까요? 그 시나리오는, 당황하면 쉽게 생각할 수 없습니다. 두 Thread가 있습니다. 이 Thread들은, 서로 다른 값의 Integer인, 6개의 Key 값을 넣습니다. 그러면 put 메서드를 실행을 하게 될 건데요. 어떠한 일이 벌어질까요? 저는, 12보다 작아질 수 있다고 답변했습니다. 그 말이 맞을까요? 먼저 hashmap을 간단하게 보도록 하겠습니다. 3개의 static 변수만 봅시다. DEFAULT_INITIAL_CAPAC..
stop 메서드로 쓰레드를 강제 종료하면 위험하다고 했습니다. 그러면 어떻게 종료하면 좋을까요? 몇 가지 방법이 있는데요. 그 중 하나는 Interrupt 메소드를 쓰는 것입니다. worker Thread가 vector에 수를 넣는 연산을 한다고 해 봅시다. 그런데, 중간에 sleep을 넣어놓았습니다. 이 때 worker Thread에 Interrupt를 걸면 어떻게 동작하는지 봅시다. Main이 단위시간 1동안 sleep를 하고, Int를 출력합니다. 그리고 w1에 Interrupt를 보내는데요. 공식 문서에 나온 이 함수의 설명을 빌리면, 아래와 같습니다. 여기서 중요한 키워드를 뽑아보면, blocked, 인터럽트 status, receive, 인터럽트 예외 정도가 있습니다. wait나 join, s..
최근댓글