2013-02-26 2 views
1

잠금이 오브젝트 레벨에 올 때까지 잘 작동하는 코드 스 니펫을 찾고 동일한 잠금이 정적 최종 (static 키워드)이 추가 될 때 동시성 관련 오류로 인해 코드 시작에 실패합니다.오브젝트 레벨 및 클래스 레벨 잠금

오브젝트 레벨 reamin에서 작동하는 잠금은 일단 범위가 고정되면 작동해야합니까? 나는 정적으로 제한을 만들 것이고 객체 수준에있을 때보 다 더 많은 동시 병행을 일으키지 말아야한다고 생각했습니다. 나는 그런 일이 일어나는 것을 발견하고있다.

+1

코드를 게시 할 수 있습니까? – radai

+0

오류에 대한 자세한 내용 –

+0

어떤 오류가 발생합니까? –

답변

1

일단 개체 범위에서 동작하는 잠금 장치는 범위가 고정되면 작동해야합니까?

당신은 원인 동시성 문제 안 정적 잠금을 할 인스턴스 잠금되지 않도록 잠금을 이동합니다. 다중 인스턴스 잠금 대신 단일 잠금이 사용된다는 점에서 코드가 더 제한적이어야한다는 것이 맞습니다. 문제의 자물쇠가 static final이고 코드의 모든 위치가 적절하게 잠겨 있다면 이것은 물론입니다.

public static final Object lockObject = new Object(); 

잠금 장치를 움직이면 이전에 있던 버그가 발견되었지만 응용 프로그램 타이밍에 숨겨진 버그가 발견되었을 수 있습니다. static 잠금 (또는 static 메서드)을 잠그면 응용 프로그램의 스레드 타이밍이 크게 변경됩니다.

코드 또는 오류에 대한 자세한 내용을 게시하면 더 나은 답변을 제공 할 수 있습니다.

+0

그레이, 이건 내가 가진 유일한 의심 이었어. 그리고 요즘 나는 객체 레벨 잠금의 경우에도 그 오류를 더 무작위로 얻기 시작했습니다. 나중에 더 나은 코드 기반으로 제 질문을 수정 해 보겠습니다. – fortm

0

정적 수준의 잠금은 객체 수준의 잠금보다 다른 스레드간에 공유 될 가능성이 높습니다 (매우 일반적인 방식 - 실제 코드와 관련된 스레드에 따라 다르므로).

실제로는 정적 잠금이 클래스와 연결됩니다. 즉, 단일 잠금 개체가 모든 스레드간에 공유됩니다. 일반적으로 더 많은 스레드가 동일한 잠금에 대한 액세스를 필요로 할 때 코드에 버그가있는 경우 동시성 문제 (예 : 교착 상태 및 기아 상태)를 실행할 가능성이 높아집니다.

일반화로 객체 수준 잠금을 사용하여 동시성 문제가 발생했다면 대신 클래스 수준의 잠금을 승격 할 때 더 많은 문제가 발생할 수 있습니다.

+0

저에게 더 나쁜 소식입니다. 때때로 잠금 장치를 고정시킬 때도 때때로 교착 상태가됩니다. 그래서 숙제가 있습니다 : P – fortm

+0

문제가 데이터베이스 액세스와 관련된 경우 최대 절전 모드와 같은 ORM 라이브러리를 사용해보십시오. 또는 별도의 SQL 트랜잭션으로 삽입을 격리 할 수도 있습니다. – RudolphEst

관련 문제