저번시간에 redis의 incr에 대해 배웠습니다. 그러면서 ttl이 있는 counter를 구현해 보았는데요. 한 가지 문제점이 있었습니다. incr을 하고, ttl을 설정하는 것이 2개의 작업으로 쪼개졌었습니다. 이 작업 하나 하나는 atomic 하겠지만, 두 개의 작업은 그렇지 않습니다. race condition이 발생했을 때, 문제가 발생할 수 있는 여지가 있었는데요. 문서에서 몇 가지 방법을 소개했었습니다. 그 중에 2.6 이상부터 가능한 LUA script와 eval 명령어를 이용하는 방법이 있습니다. 간단하게 소개해 드리도록 하겠습니다. 먼저, eval은 LUA script, key 갯수, 키, argument들로 구성됩니다. 스크립트는 이 문서를 보시면 됩니다만, 간단한 예제 몇 개를 보면..
atomic 검색 결과
multithreading을 공부하시다 보면, GIL에 대해 한 번 정도는 들어보시게 됩니다. Global Interpreter Lock의 줄임말입니다. 그런데 이것이 있으면 Lock이 필요 없을까요? 관련 질문을 봐도, 답은 한결같이 아닐 수도 있다는 것이였습니다. [관련글] 원자성을 만족하는 연산을 n번 호출하는 연산은 원자적일까요? 이 문서를 읽어 보시면, 각각의 byte code가 어쩌고 저쩌고 언급을 하다가 atomic 하다는 언급을 하고 있어요. 아래 예제를 보도록 하겠습니다. foo는 global 변수 x에 diff를 100번 더합니다. main 부분을 보겠습니다. diff가 1, -1, 1, -1이 들어감을 알 수 있어요. 18번째 줄에 target이 foo 메서드이고, args가 li의 ..
안녕하세요. 백준 chogahui05입니다. Vector는 ArrayList와 다르게, 주요 메서드에 synchronized가 붙은 클래스입니다. 여기서 질문 하나 드리겠습니다. 다음 코드는 어떻게 동작할까요? 쓰레드 n개를 생성했다고 해 봅시다. 그러면 이 프로그램은, 항상 비어있는 벡터를 리턴할까요? 혹은, 항상 제대로 동작할까요? vector는 ArrayList와는 다르게 주요 메서드에 동기화 처리가 되어 있습니다. 이는 StringBuilder와 StringBuffer와의 관계와도 같습니다. 전자는 동기화 처리가 되어 있지 않고, 후자는 되어 있다. 정도로 이해하시면 됩니다. 실제로, Worker 클래스의 run 메서드 안에 있는 메서드 3개를 봅시다. isEmpty는 elementCount가 0..
최근댓글