2012-06-20 3 views
1

이전 프로젝트를 업데이트하고 있는데 IDE에서 "폐기 된"것으로 표시된 객체를 제거해야하는지 궁금합니다. 해당 객체는 Vector 및 Hashtable입니다. 나는 약간의 연구를했으며, ArrayList와 HashMap의 새로운 객체가 기본적으로 동일하고, 단지 동기화되지 않은 것으로 보입니다.ArrayList 및 HashMap과 같은 클래스가 동기화되지 않는 이유는 무엇입니까?

제 질문은 왜 전환해야합니까? 소량의 속도에 대한 대가로 응용 프로그램에서 약간의 보안을 해치고 있지 않습니까? 기념비적 인 결정이 아닌 것처럼 보입니다. 그러나 결정을 내리기 전에 시간이 가치가 있는지 알 것입니다.

감사합니다.

+3

이러한 객체에 멀티 스레드/동시 코드가 적용되지 않으면 동기화가 필요하지 않을 수 있습니다. 따라서 'synchronized'블록에서 가능한 성능 저하가 발생하지 않아도됩니다. 'Vector'와'Hashtable'은 Java API에서 더 이상 사용되지 않거나 더 이상 사용되지 않습니다. 각각의 인터페이스가 동일한 인터페이스를 제공합니다. 마찬가지로 Java 5 이상에서는'java.util.concurrent'에 액세스 할 수 있습니다.이 컨테이너는 동시 액세스 컨테이너가 필요한 경우 더 나은 컨테이너를 수행합니다. – birryree

+2

필요할 경우 언제든지 Collections.synchronizedList();로 래핑 할 수 있지만 Jon의 대답은 먼저 – Attila

답변

9

약간의 속도 대신 응용 프로그램에서 약간의 보안을 제거하지 않습니까?

유일한 스레드 보안이 VectorHashtable의 동기화에 의존하는 경우 거의 확실하게 문제가 발생합니다.

일반적으로 더 거친 작업을 동기화해야합니다. "컬렉션에 대한 각각의 작은 작업을 동기화하고 충분히 좋기를 바랍니다"라는 접근 방식은 거의 절대 필요한 것이 아니므로 전혀 사용하지 않는 이유는 무엇입니까?

스레드간에 변경 가능한 데이터 (예 : 컬렉션)를 공유하는 경우 신중하게 변경하는 방법을 고려해야합니다. VectorHashtable을 사용하면 잘못된 보안 감각을 부여 할 수 있습니다.

+1

AFAIK를 참조하십시오. ['java.util.concurrent.ConcurrentHashMap'] (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html)을 동기화 된 맵 구현의 대안으로 사용할 수 있습니다. –

+0

CopyOnWriteArrayList는 쓰기 수가 적을 때 유용 할 수 있습니다. –

2

synchronized은 상당한 성능 저하를 가져 오며, 종종 동시성에 대한 최선의 방법이 아닙니다.

스레드 안전 컬렉션이 필요한 경우 java.util.concurrent의 컬렉션을 사용하십시오.

This article 약간의 도움이 될 수 있습니다.

+0

기사 주셔서 감사합니다! – FreakinOutMan

1

저는 여러분이 자신이 생각하는 '보안'을 확신하지 못합니다. 필자는 일반적으로 내장 된 항목 (Vector/Hashtable 또는 Collections.synchronizedList (새 ArrayList())/Collections.synchronizedMap (새 HashMap()))에 의존하기보다는 동기화를 직접 수행하고자 함을 발견했습니다. .

내 자신의 잠금 모니터를 만들고 모든 잠금을 직접 제어하는 ​​경향이 있습니다. 내가 그렇게하지 않으면 복잡한 다중 단계 작업을 잠그는 것을 잊어 버리지 않고 잊어 버리는 경향이 있습니다. 나는 당신이 당신의 시스템에서의 잠금에 대해 어떻게 생각하는지 강요한다. 그렇지 않으면 사실 당신이 안전하지 않을 때 안전하다고 느끼기 쉽다. 잠그는 것은 당신을 정말로 망칠 수있는 무언가이며, 제대로하지 않으면 버그의 둥지가 될 수 있습니다. 필요한 곳에 잠금을 설정하고 잠금으로 액세스를 보호하는 방법을 이해하는 것이 좋습니다.

관련 문제