طريقة التزامن الأساسية في Java هي استخدام الكلمة الرئيسية المتزامنة للتحكم في الوصول المتزامن للطريقة. كل طريقة معلنة مع الكلمة الرئيسية المتزامنة هي قسم حرج. في Java ، يُسمح بالوصول إلى واحد فقط من الأقسام الهامة من نفس الكائن في نفس الوقت.
الأساليب الثابتة لها سلوكيات مختلفة. لا يمكن الوصول إلى الطريقة الثابتة التي تم إعلانها مع الكلمة الرئيسية المتزامنة إلا من خلال مؤشر ترابط تنفيذ واحد ، ولكن يمكن لخيوط أخرى الوصول إلى الطريقة المتزامنة غير المنتظمة لهذا الكائن. يجب أن يكون هذا حذرًا للغاية لأن خيوطان يمكن أن يصلوا إلى طريقتين متزامنين مختلفين لكائن ما في نفس الوقت ، أي أحدهما طريقة متزامنة ثابتة والآخر طريقة متزامنة غير قابلة للثلاث. إذا غيرت كلتا الطريقتين نفس البيانات ، فسيحدث خطأ غير متناسق.
بناء الجملة للكتلة المتزامنة كما يلي:
طريقة الفراغ العام () {Synchronized (Expression) {}} هناك استخدامان للكلمة الرئيسية المتزامنة. يتم استخدام واحد فقط في تعريف الطرق ، والآخر هو الكتلة المتزامنة. لا يمكننا فقط استخدام متزامن لمزامنة متغير كائن ، ولكن يمكنك أيضًا استخدام SynchronizedL لمزامنة الطرق الثابتة والطرق غير المنتظمة في الفئة.
الأول: مزامنة الأساليب غير الستاطية
من بناء الجملة المتعلق بـ Java ، يمكننا أن نعلم أن استخدام الكلمة الرئيسية المتزامنة لتحديد طريقة ما سيؤدي إلى قفل الطرق الثابتة والطرق غير المنتظمة المحددة بواسطة الكلمة الرئيسية synchroniezd في الفصل ، ولكن هذا صعب بعض الشيء. إذا كنت ترغب في مزامنة الكتل لتحقيق مثل هذا التأثير ، فليس من الصعب فهم سبب إنتاج هذا التأثير. إذا كنت تستخدم متزامنًا لقفل جميع الأساليب غير المنتظمة المتزامنة في الفصل ، فأنت بحاجة فقط إلى استخدام هذا كمعلمة للكتلة المتزامنة لتمريرها إلى الكتلة المتزامنة. الرمز كما يلي:
اختبار الفئة العامة {public void method1 () {synchronized (this) {}} public synchronized void method2 () {}} اختبار الفئة العامة {public void method1 () {synchronized (this) {}} في الكود أعلاه ، تستخدم Method1 الكتلة المتزامنة ، وتستخدم طريقة Method2 الكلمة الرئيسية المتزامنة لتحديد الطريقة. إذا كنت تستخدم نفس مثيل الاختبار ، طالما تم تنفيذ إحدى هاتين الطريقتين ، فسيتم حظر الطرق الأخرى لأنها لم تحصل على قفل التزامن. بالإضافة إلى استخدام هذا كمعلمة للكتلة المتزامنة ، يمكنك أيضًا استخدام Test. هذه كمعلمة الكتلة المتزامنة لتحقيق نفس التأثير.
في استخدام الكتل المتزامنة في الفصول الداخلية ، يمثل هذا فقط الطبقات الداخلية وليس له أي علاقة مع الطبقات الخارجية (CONCLASS). ومع ذلك ، يمكن أيضًا مزامنة الأساليب غير المنتظمة في الفئات الداخلية والطرق غير المنتظمة في الطبقات الخارجية. إذا قمت بإضافة طريقة Method3 إلى الفئة الداخلية ، فيمكنك أيضًا مزامنة الطريقتين في الاختبار ، فإن الكود كما يلي:
اختبار الفئة العامة {class innerclass {public void method3 () {synchronized (test.this) {}}} اختبار الفئة العامة {class innerclass {public void method3 () {synchronized (test.this) {}}} يمكن أن يكون طريقة Method3 للكلمة الداخلية أعلاه وطرق Method1 و Method2 للاختبار طريقة واحدة فقط تنفذ في نفس الوقت.
ما إذا كان يتم تنفيذ الكتلة المتزامنة بشكل صحيح أو تم الخروج من الكتلة المتزامنة بسبب استثناء بسبب خطأ في البرنامج ، سيتم إصدار قفل المزامنة المحتفظ به بواسطة الكتلة المتزامنة الحالية تلقائيًا. لذلك ، لا داعي للقلق بشأن قفل المزامنة عند استخدام الكتلة المتزامنة.
2. تزامن الأساليب الثابتة
نظرًا لأن مثيلات الكائن لا يتم إنشاؤها بالضرورة عند استدعاء الطرق الثابتة ، فلا يمكن استخدام هذا لمزامنة الطرق الثابتة ، ولكن يجب استخدام كائنات الفئة لمزامنة الطرق الثابتة. الرمز كما يلي:
اختبار الفئة العامة {public static void method1 () {synchronized (test.class) {}} public static static void method2 () {}} اختبار الفئة العامة {public static void method1 () {synchronized (test.class) {}}عند مزامنة الطرق الثابتة ، يمكنك استخدام فئة الحقل الثابت للفئة للحصول على كائن الفئة. في المثال أعلاه ، لا يوجد سوى طريقة واحدة تنفيذ Method1 و Method2. بالإضافة إلى استخدام حقل الفصل ، يمكنك أيضًا الحصول على كائن الفئة من خلال طريقة getClass () للمثال. الرمز كما يلي:
اختبار الطبقة العامة {اختبار اختبار ثابت عام ؛ اختبار عام () {test = this ؛ } method static void method1 () {synchronized (test.getClass ()) {}} اختبار الفئة العامة {اختبار ثابت عام ؛ اختبار عام () {test = this ؛ } method method1 () {synchronized (test.getClass ()) {}}}
في الكود أعلاه ، نحصل على مثيل للاختبار من خلال كائن ثابت عام ، والحصول على كائن فئة من خلال طريقة getClass لهذه المثيل (لاحظ أنه يتم الحصول على جميع مثيلات الفصل من خلال طريقة getClass). يمكننا أيضًا مزامنة الطرق الثابتة لفئات مختلفة من خلال الفصل ، والرمز كما يلي:
الفئة العامة test1 {public static void method1 () {synchronized (test.class) {}}} الفئة العامة test1 {public static void method1 () {synchronized (test.class) {}}}
ملاحظة: عند استخدام الكتل المتزامنة لمزامنة الأساليب ، يمكن مزامنة الأساليب غير المنتظمة من خلال هذا ، في حين يجب مزامنة الطرق الثابتة باستخدام كائنات الفئة ، ولكن يمكن أيضًا مزامنة الطرق غير المستقلة باستخدام الفئة. ومع ذلك ، لا يمكن استخدام هذا في طرق ثابتة لمزامنة الأساليب غير المنتظمة. يجب الانتباه إلى هذا عند استخدام الكتل المتزامنة.
ملحوظة
ستؤدي الكلمة الرئيسية المتزامنة إلى تدهور أداء التطبيق ، وبالتالي لا يمكن استخدامها إلا على الطرق التي تتطلب تعديل البيانات المشتركة في السيناريوهات المتزامنة. إذا وصلت مؤشرات الترابط المتعددة إلى نفس الطريقة المتزامنة ، يمكن لخيط واحد فقط الوصول إليها وسينتظر مؤشرات الترابط الأخرى. إذا لم يستخدم إعلان الطريقة الكلمة الرئيسية المتزامنة ، فيمكن لجميع مؤشرات الترابط تنفيذ الطريقة في نفس الوقت ، وبالتالي تقليل وقت التشغيل الكلي. إذا كان من المعروف أنك تم استدعاؤك من قبل أكثر من مؤشر ترابط ، فلن تحتاج إلى إعلانه باستخدام الكلمة الرئيسية المتزامنة.
الأساليب المعلنة المزامنة يمكن أن تسمى بشكل متكرر. عندما يصل مؤشر ترابط إلى طريقة مزامنة الكائن ، يمكنه أيضًا استدعاء طرق التزامن الأخرى للكائن ، بما في ذلك طريقة التنفيذ ، دون الحاجة إلى الوصول إلى الطريقة مرة أخرى.
يمكننا حماية الوصول إلى كتل التعليمات البرمجية (بدلاً من الطريقة بأكملها) من خلال الكلمة الرئيسية المتزامنة. يجب استخدام الكلمة الرئيسية المتزامنة على هذا النحو: يبقى بقية الطريقة خارج كتلة الكود المتزامن لتحسين الأداء. يجب أن يكون الوصول إلى القسم الحرج (أي ، كتل التعليمات البرمجية التي لا يمكن الوصول إليها إلا بواسطة مؤشر ترابط واحد في نفس الوقت) قصيرة قدر الإمكان. على سبيل المثال ، في تشغيل الحصول على عدد الأشخاص في المبنى ، نستخدم فقط الكلمة الرئيسية المتزامنة لحماية التعليمات لتحديث عدد الأشخاص ، وجعل العمليات الأخرى لا تستخدم البيانات المشتركة. عند استخدام الكلمات الرئيسية المتزامنة بهذه الطريقة ، يجب استخدام مرجع الكائن كمعلمة واردة. يُسمح فقط لخيط واحد بالوصول إلى هذا الكود المتزامن في نفس الوقت. بشكل عام ، نستخدم هذه الكلمة الرئيسية للإشارة إلى الكائن الذي تنتمي إليه الطريقة التي يتم تنفيذها:
متزامن (هذا) {// Java Code}