2012-10-12 4 views
1

의 지속성 로더를 동기화 :<code>PersistenceController</code> 클래스에서 나는 다음과 같은 방법으로 지속성 항목에서로드하기위한 클래스가 자바

Item loadItem(int id); 

을 그래서 지금은 다른 컨트롤러에서 다음과 같은 방법을 구현하려는 :

synchronized Item getItem(int id){ 
    Item result= getItemFromMemory(id); 
    if (result==null){ 
     result=PersistenceController.loadItem(id); 
    } 
    return result; 
} 

목표는 동시에 동일한 ID의 항목 인스턴스를 하나만 (또는 0) 확보하는 것입니다. 이 방법은 효과가 있지만 한 가지 문제가 있습니다. 모든로드 항목은 서로를 기다려야합니다. 둘 다 동일한 ID를 가지고있는 경우에만 다른 호출 대기를 위해 동기화 체계를 변경하고 싶습니다.

가장 좋은 방법은 무엇입니까?

+0

그러면 ID를 잠궈 야합니다. 이 대답을 참조하십시오 [1] : http://stackoverflow.com/questions/659915/synchronizing-on-an-integer-value – MLN

+0

귀하의 ID는 실제로 int 프리미티브로 표시됩니까? id 클래스에 객체를 사용하는 경우 getItem 메소드를 동기화하는 대신 ID 객체 자체에서 동기화 할 수 있습니다. – Luhar

+0

정수에서 뮤텍스를 가져올 수 있는지 알지 못했습니다. 그것에 대해 질문이 있습니까? 프로그램의 다른 부분에서 같은 기술 (다른 무관 한 작업을 위해)을 사용하고 ID가 충돌하면 어떨까요? 이것은 잘못된 대기로 끝날 수 있습니까? 나는 잠금을 처리하기 위해 SparseArray 을 사용하는 것이 맞습니까? – Addev

답변

1

난 당신이 원하는 것을 달성하는 유일한 방법은 생각은 Custom Lock 당신이 통과 정수를 기반으로 잠금을 생성 할 AbstractQueuedSynchronizer를 사용하여 작성하는 것입니다 그러나 그것은 매우

Synchronizing on an Integer value 추천 ConcurrentHashMap를 사용하여 솔루션을 제공하지 않고, 그것의 자신의 결함을 가지고 . 같은 자물쇠를 획득 한 경우지도에서 값을 삭제할 수 없으므로 원하지 않는 인스턴스를 ConcurrentHashMap으로 작성하지 않으면 값을 삭제할 수 없습니다.

오히려 가능한 방법은 잠금 수를 늘리는 것입니다.

관련 문제