ما عليك سوى تسجيل كيفية استخدام الكلمة الأساسية المتزامنة في Java.
قبل المقدمة، من الضروري توضيح أن كل مثيل كائن لفئة في Java له قفل واحد فقط (قفل) مرتبط به، تعمل الكلمة الأساسية المتزامنة فقط على هذا القفل، أي يمكن اعتباره متزامنًا فقط يؤثر على مثيلات كائن فئة Java.
وظيفة معدلة متزامنة
انسخ رمز الكود كما يلي:
العامة المتزامنة aMethod () {
}
هذا هو السيناريو الأكثر استخدامًا، فما هو الغرض من طريقة المزامنة هذه؟
1. ما هي الأقفال المتزامنة التي تستدعي طريقة المزامنة هذه؟ على سبيل المثال، ستحدث المزامنة عندما يستدعي نفس المثيل P1 طريقة في سلاسل رسائل مختلفة؛
2. تجدر الإشارة إلى أن كائنًا آخر P2 من الفئة التي ينتمي إليها هذا الكائن يمكنه استدعاء هذه الطريقة بشكل تعسفي، لأن الطرق المتزامنة لمثيلات الكائنات المختلفة لا تتداخل مع بعضها البعض. بمعنى آخر، لا يزال بإمكان مؤشرات الترابط الأخرى الوصول إلى أسلوب aMethod في مثيل كائن آخر من نفس الفئة في نفس الوقت؛
3. إذا كان للكائن عدة طرق متزامنة، مثل aMethod وbMethod وcMethod، فطالما أن مؤشر ترابط واحد يصل إلى إحدى الطرق المتزامنة، فلن تتمكن مؤشرات الترابط الأخرى من الوصول إلى أي طريقة متزامنة في الكائن في نفس الوقت.
الكود أعلاه يعادل في الواقع ما يلي:
انسخ رمز الكود كما يلي:
الفراغ العام aMethod () {
متزامن (هذا) {
}
}
يشير هذا هنا إلى مرجع كائن المثيل، مثل P1. يمكن ملاحظة أن جوهر طريقة المزامنة هو تطبيق المزامنة على مرجع الكائن. فقط الخيط الذي حصل على قفل كائن P1 يمكنه استدعاء طريقة المزامنة لـ P1، وبقدر ما يتعلق الأمر بقفل P1، فقد يتخلص البرنامج أيضًا من التحكم في آلية المزامنة الوضع، مما تسبب في ارتباك البيانات. ومن هذا نستمد كتلة المزامنة أدناه.
كتلة التعليمات البرمجية المعدلة المتزامنة
انسخ رمز الكود كما يلي:
dMethod الفراغ العام (SomeObject so) {
متزامن (هكذا) {
}
}
القفل الذي تم الحصول عليه عن طريق المزامنة هنا هو قفل الكائن، لذلك يمكن لأي شخص يحصل على القفل تشغيل الكود الذي يتحكم فيه. عندما يكون هناك كائن واضح مثل القفل، يمكنك كتابة البرنامج مثل هذا، ولكن عندما لا يكون هناك كائن واضح مثل القفل وتريد فقط مزامنة جزء من التعليمات البرمجية، يمكنك إنشاء متغير مثيل خاص (يجب أن يكون كائن) ليكون بمثابة القفل:
انسخ رمز الكود كما يلي:
فئة Foo تنفذ Runnable {
البايت الخاص[] lock = البايت الجديد[0];
طريقة الفراغ العام () {
متزامن (قفل) {
}
}
}
سيكون إنشاء كائن صفيف بايت ذي طول صفري أكثر فعالية من حيث التكلفة من أي كائن آخر.
طريقة ثابتة معدلة متزامنة
كما ذكرنا سابقًا، فإن الكلمة الأساسية المتزامنة صالحة فقط لمثيلات P1 في سلاسل محادثات مختلفة، فكيف يمكن أن تكون صالحة لمثيلات مختلفة من P1 وP2 في نفس الوقت؟ يمكن القول أن الفصل مملوك لهذه الفئة، ولا يعتمد على مثيلات الفصل، لذلك نحتاج فقط إلى استخدام الكلمة الأساسية المتزامنة لتعديل الأساليب الثابتة للفئة لتحقيق التزامن بين المثيلات المختلفة.