2013-04-10 1 views
2

가 명확하게 고쳐 동기화 블록 사용 개체 암시 적 잠금수없는 이유는 내가 직접 액세스 (및 잠금)

좀 더 명시 적 잠금과 동기화 된 블록의 사용을 혼합 할 수 있도록하고 싶습니다

적절한 때에 직접 잠금 및 해제 메소드 호출을 통해. 따라서 sychtronized (myObject)를 사용할 때 신택스 설탕을 허용하면서 myObject.lock을 호출 할 수 있습니다. & myObject.unlock 동기화 된 블록이 필요한만큼 수행 할 수 없을 때 dierctly합니다. 끝난.

모든 단일 객체에는 동기화 된 블록에서 사용되는 임대인 잠금이 암시 적으로 내장되어 있습니다. 실제로 잠금 잠금은 동기화 된 블록에 들어갈 때마다 개체 내부 재진입 잠금에 대해 호출되며 동기화 블록을 벗어날 때 동일한 재진입 잠금에서 잠금이 호출됩니다. 나는이 inplicit 재진입 잠금을 수동으로 잠 그거나 잠금 해제 할 수있는 능력을 허용하기는 쉽지 않은 것 같습니다. 따라서 동기화 된 블록을 혼합하고 잠금을 해제 할 수 있습니다.

그러나 내가 아는 한이를 수행 할 방법이 없습니다. 그리고 동기화 된 블록이 작동하는 방식 때문에 나는 명시 적으로 잠금을 해제하는 것과 그들을 섞는 편리한 방법이 있다고 믿지 않습니다. 이것은 마치 편리하고 잠금 API/메소드를 추가하기 위해 Object API를 사용하여 쉽게 추가 된 것처럼 보입니다.

내가 가진 질문은 왜 존재하지 않는 것입니까? 나는 이유가 있다고 확신하지만 그것이 무엇인지는 모른다. 캡슐화 문제 일 수 있다고 생각했습니다. 동기화를 원하지 않는 동일한 이유 (this). 그러나 이미 sycnhronized (myObject)를 호출하고 있다면 defObject를 통해 myObject에 대해 아는 사람이라면 누구나 마찬가지로 동기화 할 수 있으며 어리석은 짓을하게되면 교착 상태가 발생할 수 있습니다. 캡슐화 문제는 sychtronized 블록을 사용하거나 수동으로 객체를 잠그지 않고 동기화 한 객체에 누가 액세스 할 수 있는지에 대한 것입니다. 적어도 나는 그것을 본다. 그래서 수동으로 객체를 잠그지 못하게하는 다른 이점이 있습니까?

+0

내 현재 삭제 된 답변 및 그 뒤를 따르는 답변을 방지하기 위해 동일한 모니터에서 동기화하려고한다고하지만 ** ** 원하지는 않습니다. 'synchronize' 문을 사용합니다. 어떤 종류의 모니터 객체를 가져 와서 그 객체에'lock' 메소드를 호출하고, 다른 로직을 수행하고,'release'를 호출하기를 원한다. 동기화 된 방법과 동기화 된 블록에 대한 질문이 아니라 명시 적 "잠금"및 "해제" "호출을 통해 동일한 모니터 사용에 관한 질문입니다. –

+0

이제 그는 그가 무엇을 알고 싶어하는지 모르겠다. 마지막 단락은 고급 객체 지향 디자인 주제로 이해된다. 첫 번째 단락은 초보자가 스레드 안전성에 대해 질문한다. 중간 단락에서 그는 sycronized 블록에 대해 taks, 그는 syncronied 방법을 의미하거나, 이것에 syncronizing 수 있습니다. 조금은 혼란 스럽네요. – AlexWien

+0

예 TJ, 나는 네가 한 말을 묻고있다. 미안해. 문구가 잘 안되면, 내가 원하는 것을 선물하는 법을 생각할 수 없다. – dsollen

답변

4

특정 개체의 잠금은 인스턴스 자체와 밀접하게 관련되어 있습니다. synchronized 블록 및 방법의 구조는 매우 엄격합니다. 프로그래머로서 시스템 (가상 시스템)에 간섭 할 가능성이있는 경우 심각한 문제가 발생할 수 있습니다.

  • 당신은 결국 synchronized 블록에 의해 생성 된 잠금을 해제 할 수
  • 당신은 다른 synchronized 블록 당신은 더 락 출구를 만들
  • 당신은 종료보다 더 많은 잠금 항목을 작성 발표 할 예정 잠금을 만들 항목보다

lockrelease 작업에 대해 정의 된 특정 바이트 코드조차 있습니다. 이 잠금/잠금 해제 작업을위한 "메소드"가 있다면이 바이트 코드로 컴파일해야합니다. 따라서, 은 실제로는 로우 레벨 연산이며, 다른 Java 오브젝트 레벨 구현과 매우 다릅니다.

동기화는 매우 강력한 계약입니다. 나는 JLS의 디자이너들이이 계약을 깰 가능성을 허용하고 싶지 않다고 생각한다.

Chapter 17 of the JLS은 예상되는 동작에 대해 자세히 설명합니다.

관련 문제