분리 잠 금 기반 hash 맵 구현

자바 병행 프로 그래 밍 실천 제1 1 장, 11.4 자물쇠 경쟁 감소.
    Concurrent HashMap 의 실현 은 16 개의 대상 자 물 쇠 를 포함 하 는 배열 을 사 용 했 습 니 다. 모든 자 물 쇠 는 hash buckets 배열 의 동기 화 를 담당 합 니 다.  1 / 16 의 원소;buckets 의 n 번 째 요 소 는 locks 에서 n 번 째 를 16 개의 자물쇠 로 나 누 어 지 킵 니 다. hash 알고리즘 의 실현 이 합 리 적 인 확장 성 을 제공 할 수 있 고 키 워드 는 통 일 된 방식 으로 접근 할 수 있다 고 가정 하면 자물쇠 에 대한 요 구 를 원래 의 1 / 16 로 줄 일 수 있 습 니 다. 이러한 분리 잠 금 디자인 을 바탕 으로 하 는 기술 은 Concurrent HashMap 이 16 개의 동시 다발 요 구 를 지원 할 수 있 습 니 다.
  그러나 자 물 쇠 를 분리 하 는 부정적인 작용 은 용기 에 자 물 쇠 를 넣 고 독점 방문 을 하 는 것 이 더욱 어렵 고 비 싸 다 는 것 이다.
예 를 들 어 buckets 의 부하 도가 밸브 값 을 초과 하면 용량 이 확장 되 어야 하고 요 소 는 다시 정렬 해 야 합 니 다. 그리고 더 큰 buckets 를 넣 을 때 우 리 는 모든 분리 자 물 쇠 를 가 져 야 합 니 다.
  잠 금 을 분리 하면 신축 성능 을 개선 할 수 있 습 니 다. 서로 다른 스 레 드 작업 이 서로 다른 데이터 (또는 같은 데이터 구조의 다른 부분) 를 지원 하기 때문에 상호 간 의 간섭 이 발생 하지 않 습 니 다. 이 점 은 잠 금 경쟁 이 잠 금 데 이 터 를 지 키 는 경쟁 보다 보편적으로 큰 절차 에 매우 유익 합 니 다.
 
public class StropedMap

{

	private static final int N_LOCKS = 16;

	private final Node[] buckets;

	private final Object[] locks;

	

	public StropedMap(int numBuckets)

	{

		super();

		buckets = new Node[numBuckets];

		locks = new Object[N_LOCKS];

		for(int i=0;i<this.buckets.length;i++){

			synchronized(locks[i%N_LOCKS]){

				buckets[i] = null;

			}

		}

	}

	

	class Node {

		Object key;

		Object value;

		Node next;



		public Node(Object key, Object value) {

			super();

			this.key = key;

			this.value = value;

			this.next = null;

		}

	}

}

 

좋은 웹페이지 즐겨찾기