0 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)

با توجه به اینکه HashMap در جاوا synchronized نیست، آیا راهی وجود دارد که آن را synchronized کرد؟

2 پاسخ

+3 امتیاز
قبل توسط (1.2هزار امتیاز)
انتخاب شده قبل توسط
 
بهترین پاسخ
راه اول که یک map کاملا sync است استفاده از SyncronizedMap است که همانطور که خود شما اشاره کردید در هر لحظه تنها یک thrad امکان کار با آن map را دارد. ولی همانطور که واضح است این نوع ساختمان داده ها اشکال performance دارند. یعنی در محیط های چند نخی، امن و کند هستند.

برای اینکه این مشکل کمی بهتر شود می توانید از کلاس java.util.concurrent.ConcurrentHashMap استفاده کنید. این کلاس به جای اینکه یک آبجکت lock به ازای همه عناصر map ایجاد کند، عناصر map را به 16 بخش تقسیم می کند و برای هر کدام ازین بخش ها یک آبجکت lock در نظر می گیرد. بنابر این در بهترین حالت 16 thread به صورت همزمان می توانند با این map به طور thread safe کار کنند. تا جایی که یادم میاد می شه این تقسیم بندی رو بهینه تر هم کرد.
+1 امتیاز
قبل توسط (1.1هزار امتیاز)

با استفاده از کد زیر می توانید این کار را انجام دهید:

Map map=Collections.synchonizedMap(hashmap);

با این کار شئ HashMap تبدیل یه یک شئ synchronized می شود و فقط یک thread می تواند بصورت همزمان به آن دسترسی داشته باشد.

سوالات مشابه

0 امتیاز
0 پاسخ 237 بازدید
+1 امتیاز
1 پاسخ 692 بازدید
+2 امتیاز
2 پاسخ 2.8هزار بازدید
+1 امتیاز
1 پاسخ 1.2هزار بازدید
سوال شده 6 سال قبل در برنامه نویسی توسط gatity (139 امتیاز)
0 امتیاز
1 پاسخ 1.0هزار بازدید
سوال شده 8 سال قبل در برنامه نویسی توسط rasta1462 (204 امتیاز)
0 امتیاز
2 پاسخ 936 بازدید
+1 امتیاز
1 پاسخ 640 بازدید
+2 امتیاز
1 پاسخ 4.5هزار بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط darya (10 امتیاز)
+1 امتیاز
1 پاسخ 3.3هزار بازدید
0 امتیاز
0 پاسخ 342 بازدید
...