سؤال

متى تفضل كائن القفل الخاص لمزامنة كتلة على القفل الجوهري (هذا)؟ يرجى الاستشهاد بأعلى كلاهما.

كائن القفل الخاص:-

Object lock =new Object();  
synchronized(lock)
{  }

القفل الجوهري (هذا):-

synchronized(this)
{  }
هل كانت مفيدة؟

المحلول

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

ربما لا تريد أن تفعل ذلك ، ولكن! ابحث عن الفصل المناسب في java.util.concurrent واستخدم ذلك بدلاً من ذلك. قون

نصائح أخرى

يمكن أن يكون القفل الخاص مفيدًا إذا كنت تقوم بعمل نوع من قفل القفل ، أي أنك تحتاج فقط إلى قفل أجزاء معينة من كائنك فقط بينما لا يزال من الممكن الوصول إلى الآخرين من قبل عميل مختلف.

أحد التوازي البسيط لفهم هذا المفهوم هو قفل جدول في قاعدة بيانات: إذا كنت تقوم بتعديل جدول واحد ، فأنت تحصل على القفل على هذا الجدول المفرد ، وليس قاعدة البيانات بأكملها ، بحيث يمكن تعديل بقية الجداول من قبل العملاء الآخرين. إذا كنت بحاجة إلى تنفيذ منطق مماثل ولكن في pojo ، فسوف تستخدم أكبر عدد ممكن من الأقفال الخاصة.

أحد الجوانب السلبية لهذا النهج هو أن فصلك يتشوش مع الكثير من الأشياء. قد يكون هذا مؤشراً على أنك تحتاج إلى إعادة تشكيلها في مجموعة أكثر حبيبًا من الفئات ذات استراتيجية قفل أبسط ولكن كل هذا يتوقف على التصميم والتنفيذ.

هذه كلاهما يستخدم الأقفال الجوهرية. مثالك الأول هو استخدام القفل الجوهري لـ lock, ، في حين أن الثانية تستخدم القفل الجوهري لـ this. والسؤال هو ما إذا كان this هو حقا ما تريد قفله ، وهو ما لا يزيد في كثير من الأحيان.

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

مفتوح القفل this فقط إذا كان المورد المهم جزءًا من الفصل نفسه. حتى في بعض الحالات ، يكون كائن القفل أفضل. أيضًا ، إذا كان هناك العديد من الموارد المختلفة في صفك ، فلا تحتاج إلى أن تكون حصرية متبادلة ككل ، ولكن بشكل فردي ، فأنت بحاجة إلى العديد من كائنات القفل.

المفتاح هو أن تعرف حقًا كيف متزامن يعمل ، وكن على دراية بما يفعله رمزك بالفعل

في الواقع ، لن يحدث استخدام أي فرق ، فهو يتعلق بالمزيد -إما عن طريق متزامن (هذا) أو متزامن صريح على أي طريقة كائن-, أو استخدام شاشة داخلية يعتمد على مشاركة مورد ما ، فقد لا ترغب في الوصول إلى مستخدمي API للوصول إلى القفل الداخلي الخاص بك أو قد ترغب في إعطاء خيار لمستخدمي API لمشاركة القفل الداخلي للكائن.

في كلتا الحالتين ، لم يكن أي من هذه الخيارات خاطئًا ، فهو يتعلق بنية مثل هذا القفل.

اقرأ تزامن جافا في الممارسة, ، سيجعلك ذلك سيدًا للتزامن وتوضيح العديد من هذه المفاهيم ، والتي ترتبط في بعض الأحيان أكثر بالاختيار الذي تقوم به بدلاً من الصواب.

كل كائن لديه قفل واحد فقط.

مع الكلمة الرئيسية المتزامنة: إذا اتصلت بطريقتين متزامنتين من نفس الكائن من موضوعين مختلفين ، يمكن لخيط واحد أن يقوم بتشغيل الطريقة الواحدة ويمكن أن يقوم الخيط الآخر بتشغيل الطريقة الثانية ، وهذا لن يحدث لأن كلتا الطريقتين تشتركان في نفس القفل الجوهري (الذي ينتمي إلى هدف). ووفقًا لهذا ، سيتعين على موضوع واحد الانتظار حتى ينتهي الخيط الآخر قبل أن يتمكن من الحصول على القفل الجوهري لتشغيل الطريقة الأخرى.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top