تقدم هذه المقالة بعض نقاط المعرفة حول الكلمات الرئيسية المتزامنة في Java Multithreading كأقفال كائن.
يعني قفل الكائن المزعوم متزامن لقفل كائن معين. للإشارة ، يرجى الرجوع إلى: هذه المقالة
1. التحليل
يمكن أن يعدل متزامن طريقة المثيل على النحو التالي:
الفئة العامة myObject {متزامنة public void methoda () {// افعل شيئًا ....}هنا ، فإن الكلمة الرئيسية المتزامنة تغلق الكائن الحالي. وهذا ما يسمى أيضا قفل الكائن.
لماذا قفل الكائن الحالي؟ نظرًا لأن Methoda () هي طريقة مثيل ، إذا كنت ترغب في تنفيذ Methoda () ، فأنت بحاجة إلى تسميتها في شكل كائن. الطريقة () (OBJ.Methoda () ، OBJ هو كائن من فئة MyObject ، يعني متزامن قفل كائن OBJ).
يمكن أيضًا كتابة الرمز أعلاه مثل هذا:
الفئة العامة myObject {public void methoda () {Synchronized (this) {// do something ....}}2. الميزات
تتمثل الميزة الواضحة لمزامنة الكلمات الرئيسية المتزامنة في أنه عندما يتم تعريف طرق مثيل معدلة متعددة متزامنة في فئة MyObject ، إذا كانت مؤشرات الترابط المتعددة لها نفس الكائن من فئة MyObject ، فإن هذه الطرق لا يمكن تنفيذها إلا بطريقة متزامنة. أي بعد تنفيذ طريقة تعديل متزامنة ، يمكن تنفيذ طريقة تعديل متزامنة أخرى.
على النحو التالي:
الفئة العامة myObject {متزامنة public void methoda () {// افعل شيئًا ....} متزامن methodblebed public methodb () {// القيام بشيء آخر}}}هناك طريقتان تعديل متزامن في فئة MyObject.
يمتد Threada من الفئة العامة threada {private myobject object ؛ // حذف المُنشّر Override public void run () {super.run () ؛ Object.Methoda () ؛ }}الموضوع A ينفذ methoda ()
يمتد ThreadB من الفئة العامة threadb {private myobject object ؛ // حذف المُنشّر Override public void run () {super.run () ؛ object.methodb () ؛ }} الموضوع B ينفذ methodb ()
الفئة العامة تشغيل {public static void main (string [] args) {myObject Object = new myobject () ؛ // موضوع A و Thread B امسك نفس الكائن: Object threada a = new threada (كائن) ؛ threadb b = threadb جديد (كائن) ؛ A.Start () ؛ B.Start () ؛ }}نظرًا لأن الخيط A و Thread B يحملان كائن كائن فئة MyObject نفسها ، على الرغم من أن هذين الخيطين يحتاجان إلى استدعاء طرق مختلفة ، يجب مزامنتهما. على سبيل المثال ، يحتاج مؤشر الترابط B إلى الانتظار حتى يتمكن مؤشر الترابط A لتنفيذ طريقة Methoda () قبل أن يتمكن من تنفيذ طريقة MethodB ().
3. الخلاصة
كما يتضح من ما سبق ، فإن نطاق القفل المتزامن الموضح في هذه المقالة هو الكائن بأكمله. إذا كان هناك عدة طرق متزامنة متزامنة في فئة ما ، وتتضمن مؤشرات ترابط متعددة نفس كائن الفئة (نفس الكائن من الفئة) ، على الرغم من أنها تسمي طرقًا مختلفة ، إلا أن تنفيذ كل طريقة متزامن أيضًا.
إذا لم تكن هناك متغيرات مشتركة بين كل طريقة متزامنة ، أو لا يوجد أي صلة بين كل طريقة ، ولكن لا يمكن تنفيذها إلا بشكل متزامن ، سيؤثر ذلك على الكفاءة.
4. التطبيق-الاستخدام متزامن لتجنب قراءة البيانات القذرة بسبب عدم تناسق البيانات
المثال التالي:
الفئة العامة myobject {private string username = "b" ؛ كلمة مرور السلسلة الخاصة = "BB" ؛ Methoda synchronesbure public void (اسم المستخدم ، كلمة مرور السلسلة) {this.userName = username ؛ حاول {thread.sleep (5000) ؛ } catch (interruptedException e) {} this.password = password ؛ } متزامن methodbed public methodb () {system.out.println ("اسم المستخدم" + اسم المستخدم + ":" + "password" + password) ؛ }}Methoda () مسؤولة عن تغيير اسم المستخدم وكلمة المرور. في الواقع ، يتوافق اسم المستخدم مع كلمة المرور.
MethodB () مسؤولة عن قراءة اسم المستخدم وكلمة المرور.
إذا لم يتم تعديل MethodB () مع متزامن ، فإن خيط A يغير اسم المستخدم عند استدعاء Methoda () إلى السطر 7 ، والتخلي عن وحدة المعالجة المركزية لسبب ما (مثل النوم على السطر 9).
في هذا الوقت ، إذا قام الموضوع B بتنفيذ MethodB () ، فإن قراءة المستخدم هو اسم المستخدم الذي تم تغييره بواسطة مؤشر الترابط A ("A") ، ولكن كلمة المرور هي كلمة المرور الأصلية ("BB"). لأن الموضوع A ينام ولم يكن لديه وقت لتغيير كلمة المرور.
ومع ذلك ، إذا تم تعديل MethodB () باستخدام متزامن ، فيمكن أن ينتظر مؤشر الترابط B فقط لرسائل الترابط A لإكمال التنفيذ (أي ، لقد قام بتغيير اسم المستخدم وكلمة المرور) قبل تنفيذ MethodB لقراءة اسم المستخدم وكلمة المرور. لذلك ، يتم تجنب مشاكل القراءة القذرة الناجمة عن عدم الاتساق في البيانات.
ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون من المفيد للجميع تعلم برمجة Java.