logback의 MDC에 대해서 문서를 보면서 공부하고 있습니다. 내부적으로 ThreadLocal을 이용을 한다는 것을 질문 답변 글에서 확인하였고, 그것 때문에 이 부분에 대해서도 공부를 하게 되었어요. 저는, 최근에 토이 프로젝트에서 요청을 날린 client의 ip를 로그에 추가하도록 바꾸었는데요. 이 과정에서 MDC를 이용하게 되었어요. 제 logback은 1.2.9 버전을 쓰고 있습니다. logback-spring.xml에서 encoder의 pattern을 %X{AAA} - %msg%n 이렇게 설정을 하였습니다. 여기서 제가 궁금했던 것은 %X라는 친구가 어떤 식으로 내부적으로 동작을 해서, MDC에 있는 것을 읽어오느냐는 것이였습니다. 이 %X는 MDC에서 AAA를 key값으로 가지는 value..
OS/이론 검색 결과
안녕하세요. 이번 시간에는 ConcurrentHashMap을 간단하게 보도록 하겠습니다. 이 글에서는 왜 이 친구를 쓸까? 정도만 보아도 되지 않을까 싶어요. 먼저 Collections의 SynchronizedMap는 이 글에서도 개략적인 구조를 설명해 드린 적이 있습니다. 간단하게 다시 보도록 하겠습니다. 먼저, mutex라는 잠금용으로 쓸 객체를 하나 둡니다. 다음에 실제 map을 하나 두는데요. 여기서 mutex는 언제 쓸까요? map에 접근할 때 동기화 용으로 쓰게 됩니다. get 메서드를 봐도 mutex에 synchronized를 걸어놓았어요. 그리고 put 메서드를 호출할 때에도 mutex에 synchronized를 걸어놓았어요. 그런데, Hash 기반에서의 자료 구조를 잘 생각해 봅시다. 얘..
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의 ..
안녕하세요. 이번 시간에는 race condition과 관련이 깊은 toctou에 대해서 알아보려고 합니다. 검사 시점과 사용 시점을 주의깊게 보시면 됩니다. 예제 프로그램을 하나 보겠습니다. 유저 객체 하나가 있습니다. Task는 유저 객체 하나를 받습니다. 그리고 Thread에 유저 객체 u가 들어간 task를 넘겨줌을 알 수 있어요. Thread를 다 돌리고, 유저의 포인트가 0보다 작아지면 u.getPoint()의 값을 출력하고 break를 걸어요. 여기서 질문. 0보다 작아지는 경우가 생길 수 있을까요? Task는 간단한 일을 수행해요. 단지, run에서 7포인트를 소비할 뿐이에요. consumePoint는 현재 포인트가 a보다 클 때, 현재 포인트에서 a를 빼게 됩니다. 사실, 우리는 결과를 ..
저번 시간에는 ArrayBlockingQueue에 대해서 잠깐 다룬 적이 있었습니다. 이번에는 Future에 대해서 다뤄 보도록 하겠습니다. Future에 대한 설명을 보면 위와 같습니다. Future는, 비동기적인 계산에 대한 result를 표현합니다. 그리고, 작업이 완료되어야, 결과를 가져올 수 있습니다. 이 말이 이해가 잘 가지 않네요. 비동기는 나중에 보기로 하고, 작업이 완료 되어야 가져 온다는 말을 이해해 보겠습니다. Future에서 쓸 수 있는 것 중 하나는 get입니다. 이것은, 계산이 완료될 때 까지 기다린 다음에, 그것의 result를 찍는 역할을 합니다. 그런데, 여기서 complete가 나옵니다. Task를 잘 생각해 보면, 진행 중인 상태가 있을 겁니다. 이를 run 상태라 하겠..
최근댓글