البرمجة

تحليل أمان ArrayList في برمجة Java المتعددة

الفهم الكامل لكيفية عمل ArrayList وكيفية تسببها في مشاكل التوازن في البرمجة المتعددة يتطلب فهماً عميقاً لمفهوم الكائنات المتزامنة وكيف يتم التعامل معها في Java. دعوني أشرح لك السياق والتفاصيل.

في البرنامج الذي قدمته، قمت بإنشاء كائن ArrayList يسمى “ar” واستخدمته في اثنين من الخيوط (t1 و t2) بشكل متزامن. يُفضل عادةً استخدام مزامنة (synchronization) عند التعامل مع هياكل البيانات المتزامنة في Java لتجنب مشاكل الاحتكاك.

تحدث مشكلتك عندما تحاول خيط t2 تغيير “ar” بينما يقوم خيط t1 بإضافة عناصر إليها. هذا يؤدي إلى تضارب في الوصول إلى ArrayList ويسبب استثناء ArrayIndexOutOfBoundsException.

حينما يقوم t2 بإعادة إنشاء ArrayList باستخدام ar = new ArrayList(1);، يقوم بتحديث المرجع ar ليشير إلى ArrayList جديدة، وفي الوقت نفسه يمكن أن يقوم t1 بمحاولة إضافة عناصر إلى الArrayList القديمة. هذا يتسبب في تضارب واضح في الحالة.

لتجنب هذه المشكلة، يُفضل استخدام مزامنة عند الوصول إلى هياكل البيانات المتزامنة. يمكنك استخدام كلمة مفتاح synchronized لحماية أجزاء حساسة من الكود. على سبيل المثال:

java
import java.util.ArrayList; import java.util.List; public class MyClass { static List ar = new ArrayList<>(1); public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread() { public void run() { while (true) { synchronized (ar) { ar.add(new Object()); } } } }; Thread t2 = new Thread() { public void run() { while (true) { synchronized (ar) { ar = new ArrayList<>(1); ar.add(new Object()); ar.add(new Object()); } } } }; t1.start(); Thread.sleep(100); t2.start(); } }

في هذا المثال، قمت بتضمين synchronized (ar) حول الأماكن حساسة في الكود لضمان أنها لا تتزامن في نفس الوقت. هذا يضمن أنه عندما يقوم أحد الخيوط بتعديل ar، لا تستطيع الخيوط الأخرى الوصول إليه حتى ينتهي الخيط الأول من العمل.

المزيد من المعلومات

تفضل، دعوني أوسع النقاش حول مفهوم عدم توافق ArrayList مع البرمجة المتعددة.

في Java، ArrayList هي تقنية تخزين ديناميّة للبيانات، حيث يمكنها تغيير حجمها تلقائياً. ومع ذلك، يعتبر ArrayList غير آمن تمامًا عند استخدامه في سياق التعددية، حيث يمكن لعدة خيوط الوصول إليه وتعديله في نفس الوقت.

مشكلتك تنشأ من محاولة تعديل ArrayList (ar) من قبل خيطين بشكل متزامن، وهذا يسبب صدامًا بينهما. في الكود السابق، عندما يقوم خيط t2 بإعادة إنشاء ArrayList باستخدام ar = new ArrayList<>(1);، يمكن لخيط t1 الوصول إلى الArrayList القديمة والقيام بالإضافة إليها، مما يؤدي إلى استثناء ArrayIndexOutOfBoundsException.

للتصدي لهذا التحدي، قمنا بتضمين كلمة مفتاح synchronized في الكود الذي قدمته. هذا يعني أن أي خيط يحاول الوصول إلى الجزء المحيط بكلمة synchronized يجب أن ينتظر حتى ينتهي الخيط الآخر من تنفيذ هذا الجزء. وبهذا يتم تجنب المشكلة الناتجة عن التعامل المتزامن مع ArrayList.

تذكيرًا، يتم استخدام مزامنة لضمان أن عمليات القراءة والكتابة تحدث بشكل آمن من قبل خيوط متعددة، مما يقلل من احتمالية حدوث تضاربات وأخطاء.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر