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 پاسخ 314 بازدید
+1 امتیاز
1 پاسخ 831 بازدید
+2 امتیاز
2 پاسخ 3.0هزار بازدید
+1 امتیاز
1 پاسخ 1.3هزار بازدید
سوال شده 6 سال قبل در برنامه نویسی توسط gatity (139 امتیاز)
0 امتیاز
1 پاسخ 1.2هزار بازدید
سوال شده 8 سال قبل در برنامه نویسی توسط rasta1462 (204 امتیاز)
0 امتیاز
2 پاسخ 1.2هزار بازدید
+1 امتیاز
1 پاسخ 756 بازدید
+2 امتیاز
1 پاسخ 4.6هزار بازدید
سوال شده 11 سال قبل در برنامه نویسی توسط darya (10 امتیاز)
+1 امتیاز
1 پاسخ 3.5هزار بازدید
0 امتیاز
0 پاسخ 416 بازدید
...