هر دو این کلاس ها در محیط های چند ترد برای بهبود کارایی و فراهم آوردن thread safety استفاده می شوند.
ConcurrentHashMap:
- 1. فقط قسمتی از داده که در حال به روزرسانی است قفل ( lock ) می شود، درحالی که باقی تردها به قسمت های دیگر دیتا دسترسی دارند.
- 2. اگر به صورت هم زمان تردی در حال update کردن دیتا باشد و ترد دیگری در حال پیمایش iterator باشد، ConcurrentHashMap تضمین می کند که ConcurrentModificationException رخ نمی دهد.
- 3. ترتیب آیتم های مپ ورودی را حفظ نمی کند. حتی زمانی که مپ ورودی ( پارامتر ارسالی constructor ) هم ترتیب را حفظ کند، تضمینی وجود ندارد که آیتم های ConcurrentHashMap به همان ترتیب مپ ورودی باشند.
SynchronizedMap :
- 1. در صورتی که تردی در حال به روزرسانی دیتا باشد، تمام دیتا قفل می شود و تردهای دیگر برای دسترسی به دیتا باید منتظر بمانند.
- 2. امکان پیمایش iterator در یک ترد و به روز رسانی هم زمان از یک ترد دیگر وجود ندارد و ConcurrentModificationException رخ می دهد.
- 3. ترتیب آیتم های ورودی حفظ می شود.
به طور کلی اگر ترتیب آیتم ها مهم باشد بین این دو از SynchronizedMap استفاده می شود. اگر به صورت هم زمان چندین reader و writer وجود داشته باشد از ConcurrentHashMap استفاده می شود. به تبع استفاده از ConcurrentHashMap مقیاس پذیری بیشتری ارائه می دهد.
اگه اشتباه نکنم توصیه شده که از ConcurrentHashMap . استفاده کنیم