2014-09-27 3 views
0

목록 (또는 다른 데이터 구조)의 여러 스레드에서 검색을 허용하지만 목록 검색 및 인터리브에서 다른 스레드의 목록 편집을 방지하는 좋은 방법은 무엇입니까? 검색 및 편집 메서드에서 동기화 된 블록을 사용하여 시도했지만 여러 스레드에서 검색을 실행할 때 불필요한 차단이 발생할 수 있습니다.검색 및 수정 동기화

편집 : ReadWriteLock은 내가 찾고있는 것입니다! 감사.

+0

달성하려는 목표를 분명히하기 위해 코드를 게시하십시오. –

+1

ReadWriteLock을 사용하십시오. – jtahlborn

답변

5

일반적으로 예 ReadWriteLock이면 충분합니다.

그러나 Java 8을 사용하는 경우 읽기 잠금을 피할 수있는 새로운 StampedLock으로 성능을 향상시킬 수 있습니다. 이것은 쓰기 (편집)와 비교하여 더 자주 읽는 (검색) 경우에 적용됩니다.

private StampedLock sl = new StampedLock(); 

public void edit() { // write method 
    long stamp = sl.writeLock(); 
    try { 
     doEdit(); 
    } finally { 
     sl.unlockWrite(stamp); 
    } 
}  

public Object search() { // read method 
    long stamp = sl.tryOptimisticRead(); 
    Object result = doSearch(); //first try without lock, search ideally should be fast 
    if (!sl.validate(stamp)) { //if something has modified 
     stamp = sl.readLock(); //acquire read lock and search again 
     try { 
      result = doSearch(); 
     } finally { 
      sl.unlockRead(stamp); 
     } 
    } 
    return result; 
    }