Java : 그들이 속한 객체와는 별도로 동기화 된 방법으로 무엇이 잠겨 있습니까?

StackOverflow https://stackoverflow.com/questions/609963

문제

자, 이것이 어리석은 질문인지 확실하지 않습니다. 그렇다면 저와 함께 해주세요.

객체의 잠금이 "재귀", 즉 두 객체가 필드에 세 번째 객체를 참조하고 스레드가 둘 중 하나에서 동기화 된 메소드를 실행중인 경우 다른 스레드가 세 번째 객체에 액세스 할 수 있습니까?

// a and b are some objects that implement Runnable
// they both reference the same third object
a.ref = c;
b.ref = c;

// a is run in a thread and processes some data in a loop for a long time
// the method the loop belongs to is declared synchronized
threadA = new Thread(a);
threadA.start();

a.someSyncedMethod(); // this would block ...
b.ref.someOtherSyncedMethod(); // ... but would this?
a.ref.someOtherSyncedMethod(); // ... and how about this?
도움이 되었습니까?

해결책

"잠금"의 개념과 "개체 잠금"의 개념을 분리하는 것이 좋습니다. "개체 잠금"에 대한 진정한 아이디어는 없습니다 - "획득 (및 릴리스)이 있습니다. 와 관련된 객체. 예, 제가 nitpicking을하는 것처럼 들리지만, 당신이 물체 잠겨있는 것은 다른 스레드가 잠금을 고정하는 동안 물체의 어떤 것도 변경할 수없는 것처럼 들립니다.

대신, 잠금 장치가 유지되는 동안 다른 스레드가 동일한 잠금 장치를 얻을 수 없음을 의미합니다. 잠금 장치와 잠금 장치와 관련된 물체의 내용 사이에는 직접적인 관계가 없습니다.

메소드는 "동기화 된"선언 된 객체의 인스턴스와 관련된 잠금을 획득합니다. 이렇게하면 동일한 객체 대기에서 다른 동기화 된 메소드와 명시 적으로 동기화되는 동기화 된 진술 만 만듭니다.

개인적으로 나는 동기화 된 방법을 좋아하지 않습니다. 동기화에만 사용되는 (개인, 최종) 멤버 변수를 명시 적으로 동기화하여 더 명확하게 만들고 싶습니다.

다른 팁

a.someSyncedMethod(); // this would block ...

실행 메소드를 동기화 된 상태로 표시하거나 동기화 된 메소드에서 실행 코드를 표시하는 경우에만 가능합니다.

JVM에서 각 객체는 모니터라고 알려진 것을 소유합니다. 한 번만 주어진 객체와 관련된 모니터를 소유 할 수 있습니다. 동기화 된 동기화는 현재 스레드를 지시하는 수단으로 계속되기 전에 모니터를 얻습니다.

또한 클래스 자체는 정적 방법에 대한 모니터를 소유합니다.

"잠금"의 의미 (실제로이 변형은 모니터라고 함)는 전적으로 협약이며 액세스 제한은 시행되지 않습니다.

기능은 데이터에 액세스하기 전에 모든 객체가 잘 행동하고 해당 잠금 잠금 장치를 획득하는 데 의존합니다. 적절한 액세스 컨트롤이있는 클래스 내 에서이 원하는 동작을 캡슐화함으로써 클라이언트 객체를 위해 시행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top