메서드에 synchronized을 걸면 그 부분은 임계영역이 되는 것은 알겠습니다.
그리고 모든 객체는 lock을 하나씩 가지고 있어서 synchronized을 적용한 부분을 들어가고 나갈때 lock의 획득과 반납이 자동으로 이루어진다고 하던데
여기서 lock이 어떤 객체의 lock인가요?
예를들어, A라는 클래스가 3개의 메서드가 있고, 그중에서 하나의 메서드만 synchronized걸려있을 때, A라는 클래스의 인스턴스가 synchronized실행한다면 그 인스턴스의 Lock이 획득되는 것인가요? 그러면 만약 다른 스레드에서 같은 인스턴스의 synchronized가 없는 다른 메서드를 동시에 호출한다면 lock때문에 실행이 block되어야 하는데 이건 아니지 않나요?
sync 붙어있는 영역만 락에 의해 블락되는거임.. 너는 근데 개발 공부 이전에 책좀 읽자...
이런식으로 글 쓰는 애들이 보통 글삭튀하던데
샛기 득도했노 - dc App
흠.. 가독성이 떨어지긴 하지만... 그정돈가..? - dc App
그러니까 그건 아는데 어떤 락이 작동하냐가 궁금하다는거지. sync 메서드가 호출된 시점부터 해당 메서드가 포함된 객체의 lock을 얻어 작업을 수행하다가 메서드가 종료되면 lock을 반환하는데 여기서 궁금한 것은 그 객체의 lock이라니까? 메서드 안에 있는 모든 객체에 대해서 lock을 얻는거임?
가독성 떨어지게 쓴건 미안타 갑자기 궁금해져서 글씀
아니면 sync메서드를 수행하는 객체 인스턴스의 lock이냐 이게 궁금
reentrance lock이 object 상속하는 모든 클래스에 포함되 있어서 임계영역에 같은 스레드 아니면 진입 못하게 되있음
그 메서드 안에 있는 모든 객체에 대해 락을 얻는건 당연히 아님.(애초에 그래서도 안되고) a.synchronizedSomething()을 호출하면 a 인스턴스가 갖고 있는 락을 취득하는거임. 그냥 synchronized라는 키워드가 작성되어 있는 그 '클래스'의 '인스턴스' 락을 취득하는거임
메소드 단위에 sync를 붙였으면 메소드만 접근이 안되는거임.. 글 쓴거 보니까 설마 A a1=new A() 이런식으로 여러개 인스턴스 생성하고 특정 메소드 호출할때 락 걸린다고 생각하는건 아니지?? - dc App
호출자의 락이 아니고 호출당하는 객체의 락임
만약 니 말대로 임계 영역 내의 모든 객체에 대해 락을 취득한다면 성능은 물론이고, 당장 데드락 때문에 프로그램이 제대로 안돌것
내가 글을 뭣같이 쓰긴 했나본데, 당연히 임계영역 내의 모든 객체에 대해서 락을 거는것은 에바라고 생각함. 그래서 A a1 = new A() 일때 a1.syncSomething() 을 호출하면 a1 인스턴스가 가지고 있는 락을 획득하는 것도 알겠는데, 이게 내가 헷갈린게 "객체에 대한 락"이라는 말때문임. 만약, a1이라는 객체를 여러 스레드가 사용하는 경우(예를 들어 싱글톤?) a1.noSyncSomething() 을 다른 스레드에서 호출한다면 첫번째 스레드가 a1에 대한 락을 가지고 있어서 noSyncSomething() 메서드가 호출이 불가능하냐 가능하냐가 궁금했음.
그건 당연히 가능하지 synchronized는 해당 키워드가 붙은 영역에 대해서만 지원하는거지 그 인스턴스의 모든 기능을 막는건 아님
음 역시 그렇구만. 코드로 테스트해봐야 하는데 사실 갑작스럽게 생각난거라 글로올렸음 모두 감사
근데 현업에서 sync쓰긴함? 저거 분석할때 많이보긴했는데 영역분리해놓는거보면 함부로 못쓰겠던디 - dc App
예약같은거나 티켓팅정도뿐인가 - dc App
거의 안쓰는걸로 알긴함. 주로 countdownlatch나 세마포어 쓰는걸로
뭐 그야 그건 우리레벨에서고.. 작업량 많은데 미쳤다고 락건들겠냐마는.. 현업은 어떨지 궁금하네 - dc App
우리 부서는 java21써서 sync 키워드보단 Reent~~Lock씀. 많이 쓰진 않고 종종쓰는듯? 중요한 상태같은거 변경할 때
21기준은 좀 ;; 17기준으로도 어찌쓰는지 모르게씀 트래픽처리때는 느려터지고, 서버여러개면 어찌할지 모르겠어서 그냥 덮었음 그냥 오라클햄들 쓰는거 보기만 봄 - dc App
임계영역이 아닌데 왜 블락된다는거임
네가 클래스의 특정 메소드에 sync를 붙인건, 인스턴스를 생성하고 그 메소드를 실행할 때마다 락을 획득하는게 아냐. synchronized는 네가 인스턴스를 하나를 생성해서 만들고 그 인스턴스의 메소드를 여러 쓰레드로 돌릴때 쓰레드 단위로 락을 획득하는거야. - dc App
저거 좀 자세하게 알고싶으면 jvm의 힙영역, 스택영역 한번 찾아보고, new 키워드를 써서 새로운 인스턴스를 생성할 때 메모리 영역에 어떻게 할당되는지도 찾아보고 - dc App
힙스택이 아니라 그냥 단일,다중인스턴스로 프린트만 찍어봐도 나옴ㅇㅅㅇ - dc App
궁금하면 영한햄 강의 들어라 기똥차게 설명해주신다 질문에 답을 하자면 스레드가 A 클래스의 락을 획득하는 것이 맞음
대충 댓글로 이해하는것보다 코드로보지. . 생각보다 쓰는거 많이 까다롭던데 현업들은 이런거 능숙하게 쓸려나 - dc App
검색어 intrinsic lock, monitor
간단하게설명하면 모든 객체는 jvm에 의해 관리되는 숨겨진 lock 이 있고, 이건 monitor라는 개념으로 구현됨. object 클래스에 있는 notify wait 이 이거랑연관됨
오 뭔가 이걸 찾고 싶었던거 같아요 감사합니다
너 밑에 가상스레드 synchronized 물어본놈임?
밑에놈은 차에코같고 얘는 그냥 따라서 공부하는듯 - dc App
정답