2011-01-24 4 views
2

지도에 저장된 데이터에 대한 요청을하는 프로그램을 개발하려고합니다. 아래와 같이 맵이 기본 방법에 선언된다메인 스레드에서 생성되고 새 스레드로 전달 된 맵 객체의 올바른 동기화

Map m = Collections.synchronizedMap(new HashMap()); 
synchronized(m) { 
     while (listening) { 

      new BrokerLookupServerHandlerThread(serverSocket.accept(), m).start(); 

     } 
} 

BrokerLookupServerHandlerThread위한 코드 입력을 받아 그 객체의 변수 일 수있다. 이 클래스에서 사용하면 원본지도도 업데이트됩니까? 나는 자바가 값으로 전달된다는 것을 이해한다. (나는 C/C++에 익숙하다.) 그래서 동기화 된 객체의 구현이 의미가 있는지 확신하고 싶었다.

private Socket socket = null; 
//private String t ="MSFT"; 
public Map m; 

public BrokerLookupServerHandlerThread(Socket socket, Map m) { 
    super("NamingServerHandlerThread"); 
    this.socket = socket; 
    this.m = m; 
    System.out.println("Created new Thread to handle client"); 
} 

도움 주셔서 감사합니다.

+0

원래지도가 업데이트되는 것에 대한 질문은 직접 시도하고 어떤 일이 발생하는지 확인하는 것이 좋습니다. 이론적 인 수준에서 토론의 이런 종류를 유지할 필요가 없습니다 :) –

답변

1

예 원본 개체가 업데이트됩니다. 그래도 ConcurrentHashMap을 사용하는 것이 좋습니다.

취득에서는의 전체 동시성 및 업데이트 예상되는 조정 동시성을 지원하는 해시 테이블. 이 클래스는 Hashtable, 과 동일한 기능 스펙을 따르며 Hashtable의 각 메소드에 해당하는 메소드 의 버전을 포함합니다. 그러나 모든 작업이 스레드로부터 안전 할지라도 검색 작업은 잠금을 수반하지 않으며 모든 액세스를 방지하는 방식으로 테이블 전체를 잠그는 데 대한 지원이 없습니다. 이 클래스는 스레드 안전성이 이고 동기화 세부 정보가 이 아닌 프로그램에서 Hashtable과 완벽하게 상호 운용됩니다.

+0

제안 해 주셔서 감사합니다. 이 경우 ConcurrentHashMap을 권장하는 이유를 확장 할 수 있습니까? – Kaigi

+0

은 장점을 가진 게시물을 업데이트했습니다. –

1

예, 맵에 대한 변경 사항은 두 스레드에서 모두 볼 수 있습니다.

Java는 실제로 전달 값을 사용하지만이 경우 값은 참조 (포인터와 유사)입니다. Java의 참조 유형 변수 값은 이며 항상 객체에 대한 참조 인이거나 null입니다. 그것은 결코 사물 자체가 아닙니다.

그래서 코드가 새지도를 만들지 않습니다. 암시 적으로 새 객체를 만드는 작업은 거의 없습니다. 필자는 문자열 리터럴 (어쨌든 리터럴이 사용되는 곳) 및 원시 유형의 자동 저장 기능 만 사용할 수 있다고 생각할 수 있습니다. 그 외에는 new 연산자를 통해서만 새 객체를 얻을 수 있습니다. (분명히 당신이 호출하는 어떤 메소드도 새로운 객체를 생성 할 수 있습니다 ...)

이것은 스레드 간 동기화의 문제와 완전히 별개입니다. 객체 복사와 참조 복사에 대한 비즈니스는 스레딩과 직각을 이룹니다. 이 경우에는 Collections.synchronizedMap을 사용하여 스레딩 aspect를 해결 한 것처럼 보입니다. 판게아 (Pangea)는 ConcurrentHashMap을 대신 사용하여 잠금을 많이 사용하지 않을 것이라고 말한 것 같습니다. ConcurrentMap 인터페이스의 또 다른 구현은 ConcurrentSkipListMap입니다. 두 클래스의 문서를보고 자신에게 가장 적합한 것을 결정하십시오.

+0

Java에서 가치에 의한 전달이 어떻게 작동하는지 명확히 설명해 주셔서 감사합니다! – Kaigi

관련 문제