2013-07-31 2 views
6

ReentrantLock 클래스의 구현을 들여다 보면서 한 가지 질문이 떠 올랐습니다. ReentrantLock은 직렬화 가능하며 문서에서 직렬화 된 모든 잠금은 직렬화 된 상태와 관계없이 항상 잠금 해제됩니다. 상태 잠금과 잠금 해제는 기본적으로 런타임에 스레드 (잠금을 보유한 사용자)를 기반으로하며 해당 스레드를 직렬화 해제하는 동안 사용할 수 없기 때문에 의미가 있습니다.Java에서 잠금을 직렬화 할 수있는 이유는 무엇입니까?

질문 : 잠금이 기본 상태 (잠금/잠금 해제)로 저장되지 않아서 잠금을 유지해야하는 이유는 무엇입니까? 지금 당장은 자물쇠의 공정성을위한 것이라고 생각할 수 있습니다. 그러나 공평성은 기본 운영 체제에 따라 다르기 때문에 한 플랫폼에서 잠금을 유지하고 다른 플랫폼에서 다시 직렬화하면 (일회 작성하고 어디에서 실행해도) 작동하지 않을 수 있으므로 공정성만을 유지할 필요가 없습니다.

희망 Java에서 Lock serialization에 대한 혼란을 분명히 나타 냈습니다.

답변

5

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html http://download.java.net/jdk7/archive/b123/docs/api/java/util/concurrent/locks/ReentrantLock.html

나는 말을 잠금이 지속하면 잠금 자체에 의존 객체를 직렬화 할 수 있는지 왜 그런지 이유가. Lock이 직렬화 가능하지 않은 경우, 그 직렬화에 의존하는 것이 직렬화 할 수 없습니다.

위와 연결된 ReentrantLock API 페이지에서 볼 수있는 owner, holdCount, queuedThreads 및 기타 모든 항목을 저장할 수도 있습니다.

+1

그런 경우 잠금이 일시적으로 선언 될 수 있으며 어쨌든 비표준화 이후에는 중요한 섹션을 다시 잠 가야합니다. – Gourabp

+1

@Gourabp 그것은 좋은 지적입니다. 내 말은, 너 아직도 그럴 수있어, 안 그래? 저는 그들이 직렬화로 "안전"하기 위해이 방법으로 만들었다 고 생각합니다. 하지만 그 이외에, 나는 그들이 정말로 왜 그렇게 확신 할 수없는 것 같아요. –

관련 문제