묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
synchronized 와 @Transactional
안녕하세요 재고관리시스템 강의를 복습하며 내용을 정리하는 중 의문이 생겨 질문을 드립니다. 가장 처음에 application code 레벨에서만 동시성을 해결하기 위해 syncrhonized 를 사용할 경우 해당 메서드에는 @Transactional 을 붙여서는 안된다고 설명해 주셨습니다. 실제로 이를 붙일 경우, 동시에 decrease 메서드가 호출되고 해당 로직 내부로 들어가는 것이 가능함을 확인하였습니다. 그런데 여기서 제가 의문이 들었던 것이 있습니다. @Transacitonal 을 사용할 경우 Spring AOP 에 의해 매 번 다른 proxy 인스턴스를 통해 target object 로의 호출을 하게 됩니다. proxy 객체에 대한 lock 은 서로 다른 프록시들 사이에 공유되지 않는다고 하더라도, 내부적으로 호출되는 target 객체에 대한 decrease 메서드는 결국 동일한 객체에 대한 호출을 하기 때문에, 공유되는 lock 에 대한 경쟁이 일어나는 것이 아닌가 생각이 들었습니다. 최종적으로는 target 객체에 대한 synchronized 메서드를 호출하는 것이라면, 단 하나의 스레드만 임계 영역에 들어갈 수 있어야 할 것 같은데, 그렇지 않음을 확인하였습니다. 왜 이런 일이 일어나는 것인지 이해가 잘 되지 않습니다 ㅠㅠ 이와 관련해서 어떤 키워드로 공부해보면 좋을지 추천 가능할까요..?
-
미해결운영체제 공룡책 강의
moniter, condition variable, synchronized에 대해서 궁금한점이 있습니다..
안녕하세요 교수님 좋은 강의 만들어주셔서 감사합니다. 자바 모니터 관련해서 궁금한게 있어 찾아보다가 이해가 잘안되어서 질문을 올려봅니다..자바에서 모든 객체는 모니터를 하나씩 가지고, 객체의 맴버변수에 스레드간 경합 없이 접근하기 위해서 synchronized 키워드를 사용해서 간접적으로 모니터를 사용하는것으로 이해했습니다. synchronized 를 매서드를 통해서 사용하는 경우 synchronized 매서드 안에서 임계구역에 접근 전에 위해 monitor에 있는 acquire을 호출해주고, 임계구역 연산 이후 release를 해주는것으로 알고있습니다. 이때 acquire안에서는 “조건변수(conditional variable)“의 wait을 호출해서 현재 임계구역에 있는 스레드의 작업이 끝날 때 까지 기다리고, release안에서는 “조건변수“의 signal을 호출해서 임계구역내에 작업을 끝마치고 대기큐에 있는 스레드를 깨워주는 것으로 이해했습니다. 여기서 질문이 있는데 조건변수(conditional variable)는 이 모니터가 속한 객체의 멤버변수 개수만큼 생기는걸까요? 아니면 synchronized 키워드의 개수만큼 조건변수가 생기는걸까요? (아니라면 멤버변수가 여러개면 각각 다르게 스레드의 대기큐를 만들어줘야 할것같은데 어떤식으로 처리되는지 궁금합니다) 공룡책 개정판 10의 307페이지에서 모니터안에 x, y 조건과 연관된 큐가 각각 부여되는거같은데, 여기서 x와 y는 어떤기준으로 만들어지는지 궁금합니다.