2012-05-02 6 views
1

아래 답변을 기반으로 : 여전히 나에게 명확하지 않습니다 : concurrentMap에서 동기화 된 구문이 있으면 무엇을합니까? 즉 concurrentmap의 경우, 동기화 된 (맵) 대 비동기 사이의 차이점은 무엇입니까? 나는 해결책의 정확성이나 믿음에 관심이 없다.. 질문에 대한 대답 : Q : concurrentmap에서 동기화하는 것과 동기화하지 않는 것의 차이점은 무엇입니까? 특히 성능면에서 .. 충분할 것입니다. 더 이상 아무것도.
나는 어떤 일이 일어나고 어떤 보충적 조언이 없어도 관심이 있습니다.동기화 된 컬렉션에서 동기화 -> 성능 문제

나는 약간의 정신적 인 문제를 해결할 수있는 이론적 인 질문이 있습니다. Concurrent Collection 클래스가 => ConcurrentHashMap map이라고 가정합니다.

내가 세 가지 방법이 있다고 가정 :


  • TestCase1 : & B. A는 방법 항목 호출하고 B가의 Method3를 호출 두 개의 스레드를 생성

    method1: synchronized(map){ 
         doSomethingWithThemap(); //Assume put integers 1.. 1000000 
    } 
    
    method2:doSomethingWithThemap(); //Note it is not synchronized 
    method3:doSomethingElseWithThemap(); //Assume put integers 2000000.. 3000000 
    

    지금이 개 테스트 케이스를 가정합니다.

  • TestCase2 : 두 개의 스레드 A '& B'를 생성합니다. A '는 method2를 호출하고 B'는 method3을 호출합니다. 내가 동기화 된 블록은지도에 잠금을하기 때문에 내가 이해에서의 TestCase1 B가 동시 불구하고,지도에 추가 할 수 없기 때문에 TestCase2은 승리를 기대하는 성능의 관점에서

하고, 이것은 TestCase2의 경우가 아닙니다.

단위 테스트이 가설을 검증하지 마십시오.

Q : 여기에 무엇이 누락 되었습니까? 즉, concurrentcollection에서 동기화 된 블록이 성능에 전혀 영향을 미치지 않는다면?

+0

method1은 1 백만 개의 정수를지도에 넣고 method2는 무엇을합니까? – esej

+0

비동기식 블록에서 정확히 같은 것. –

답변

2

Q : 여기에 무엇이 누락 되었습니까? ConcurrentHashMap 내부 자체에 동기화하는 것을

당신의 가정은 정확하지 않은 : 당신은/잠금 그들에 동기화 할 수 the source code에 따라, 구현, 컬렉션 내부에 숨겨져있는 경우 어느 java.util.concurrent.locks 개체를 사용합니다.

일반적으로 클래스 라이브러리 작성자가 따라야 할 권장 사항입니다. 개체 동기화가 필요한 경우 this; 클래스 내부에 개인 객체를 만들고 그 객체에서 대신 동기화하십시오. 그렇지 않으면 객체에서 동기화 된 다른 객체에 의해 발생하는 동시성 문제를 겪을 수 있으며 잠금을 무기한 보유 할 수 있습니다.

+0

'ConcurrentHashMap'의 요점은 맵 작업을 위해 보유해야하는 단일 전역 잠금을 가지고 있지 않기 때문에 동시에 많은 쓰레드와 쓰레드를 동시에 가질 수 있다는 것입니다. 그래서'Hashtable'과'Maps.synchronizedMap (HashMap)'이 더 좋습니다. –

+0

아직도 나에게 명확하지 않다 : 무엇이 있다면 concurrentMap에서 동기화 된 구조가 무엇을하는지. 즉 concurrentmap의 경우, 동기화 된 (맵) 대 비동기 사이의 차이점은 무엇입니까? 나는 해결책의 정확성이나 믿음에 관심이 없다.. 나는 그것이하는 일에 흥미가있다. –

+0

@OlivierTwist 귀하의 경우 스레드가 동기화하는 유일한 스레드이기 때문에 귀하의 경우 아무것도하지 않습니다. 'concurrentMap'은 구현 내부의 다른 것과 동기화됩니다. 'concurrentMap'에서 다른 스레드가 동기화 되었다면,이 스레드 중 하나만 동기화 된 블록을 실행할 것입니다. 그러나 다른 null이 아닌 객체에서도 동기화 할 수 있습니다. 당신의'concurrentMap'이라는 사실은 완전히 무의미합니다. – dasblinkenlight

0

ConcurrentHashMap이 인스턴스를 모니터로 사용한다고 보장 할 수는 없습니다. 아주 다른 객체를 사용하여 잠글 수 있습니다!

private Object lock = new Object(); 

synchronized(lock) { 
    // do some stuff - you can't get my lock because it is private 
} 

ConcurrentHashMap의 자물쇠를 사용하지만,하지 않는 것이 가능하다조차 비교 - 및 - 세트, 세마포어, 등과 같은 다소 다른 동시성 프리미티브

자바의 잠금 장치는 재 입력 가능하므로 이미 잠금을 설정하면 자신을 차단하지 않습니다.

0

ConcurrentHashMap이 synchronized를 사용하고 있지 않습니다 ... 그래도 스레드는 안전하지만 예를 들어 호출을받는 것은 아무 것도 잠그지 않습니다. 동시 데이터 구조는 꽤 좋고 흥미 롭습니다. 특정 환경에서는 내부 잠금을 사용하지만 노출 된 것은 아니며 개체의 모니터 자체를 노출시키지 않습니다.

그건 그렇고. 이와 같이 동시 코드 성능을 측정하는 것은 다소 까다 롭고 실행과 컴퓨터에 따라 다르지만 어쨌든 대부분 결함이 있습니다.

그러나 그렇지 않으면 이론적으로는 동기화 된 해시 맵을 사용하면 설명대로 작동 할 수 있습니다. Collections.synchronizedMap(yourMap);

0
What does the synchronized construct on the concurrentMap do, if anything 

단지 시간과 공간을 낭비합니다. ConcurrentMap은 이미 동시성을 처리하는 다른 방법을 구현합니다.