الكلمة الأساسية المتزامنة لها استخدامان. الأول هو استخدامه مباشرة في تعريف الطريقة كما تم تقديمها في المقالة "استخدام الكلمة الأساسية المتزامنة لمزامنة أساليب الفصل". نوع آخر هو الكتلة المتزامنة. لا يمكننا فقط مزامنة متغير الكائن من خلال الكتل المتزامنة. يمكنك أيضًا استخدام الكتل المتزامنة لمزامنة الأساليب الثابتة وغير الثابتة في الفصل الدراسي.
بناء جملة الكتلة المتزامنة هو كما يلي:
انسخ رمز الكود كما يلي:
طريقة الفراغ العام ()
{
… …
متزامن (التعبير)
{
… …
}
}
1. تزامن أساليب الطبقة غير الثابتة
من المقالة "استخدام الكلمة الأساسية المتزامنة لمزامنة أساليب الفصل"، نعلم أن استخدام الكلمة الأساسية المتزامنة لتحديد الطرق سيؤدي إلى قفل جميع الأساليب الثابتة أو غير الثابتة المحددة باستخدام الكلمة الأساسية المتزامنة في الفصل، ولكن ليس من السهل فهم ذلك. وإذا كنت تستخدم الكتل المتزامنة لتحقيق نفس التأثير، فليس من الصعب فهم سبب حدوث هذا التأثير. إذا كنت تريد استخدام كتلة متزامنة لقفل جميع الطرق المتزامنة غير الثابتة في الفصل، فأنت بحاجة إلى استخدام هذا كمعلمة للكتلة المتزامنة وتمريرها إلى بلد الكتلة المتزامنة، ويكون الرمز كما يلي:
مزامنة الطرق غير الثابتة من خلال الكتل المتزامنة
انسخ رمز الكود كما يلي:
الفئة العامة SyncBlock
{
طريقة الفراغ العام 1 ()
{
متزامن (هذا) // يعادل استخدام الكلمة الأساسية المتزامنة في طريقة الطريقة 1
{
… …
}
}
طريقة الفراغ العام 2 ()
{
متزامن (هذا) // يعادل استخدام الكلمة الأساسية المتزامنة لطريقة الطريقة 2
{
… …
}
}
طريقة الفراغ المتزامنة العامة 3 ()
{
… …
}
}
في الكود أعلاه، يتم استخدام الكتل المتزامنة في طريقتي الطريقة 1 والطريقة 2. لا تزال طريقة Method3 في السطر 017 تستخدم الكلمة الأساسية المتزامنة لتحديد الطريقة. عند استخدام نفس مثيل فئة SyncBlock، طالما أن إحدى الطرق الثلاث قيد التنفيذ، سيتم حظر الطريقتين الأخريين لأنه لم يتم الحصول على قفل المزامنة. لتحقيق نفس تأثير الكلمة الأساسية المتزامنة عند استخدام الكتلة المتزامنة، يجب كتابة جميع التعليمات البرمجية في الكتلة المتزامنة، وإلا فلن تتم مزامنة جميع التعليمات البرمجية في الطريقة الحالية مع الطرق الأخرى.
بالإضافة إلى استخدام هذا كمعلمة للكتلة المتزامنة، يمكنك أيضًا استخدام SyncBlock.this كمعلمة للكتلة المتزامنة لتحقيق نفس التأثير.
عند استخدام الكتلة المتزامنة في طريقة الفئة الداخلية (InnerClass)، فإن ذلك يمثل الفئة الداخلية فقط وليس له علاقة بالفئة الخارجية (OuterClass). ولكن يمكن مزامنة الأساليب غير الثابتة للطبقة الداخلية مع الأساليب غير الثابتة للطبقة الخارجية. على سبيل المثال، قم بإضافة طريقةmethod4 إلى الفئة الداخلية InnerClass ومزامنة طريقةmethod4 مع طرق SyncBlock الثلاث، ويكون الرمز كما يلي:
مزامنة الأساليب غير الثابتة للفئة الداخلية مع الأساليب غير الثابتة للفئة الخارجية
انسخ رمز الكود كما يلي:
الفئة العامة SyncBlock
{
… …
classInnerClass
{
طريقة الفراغ العام 4 ()
{
متزامن (SyncBlock.this)
{
… …
}
}
}
… …
}
في الإصدار الجديد من فئة SyncBlock أعلاه، تتم مزامنة طريقة الطريقة الرابعة لفئة InnerClass مع الطرق الثلاثة الأخرى لفئة SyncBlock لذلك، يمكن تنفيذ طريقة واحدة فقط من الطرق الأربعة، وهي الطريقة 1 والطريقة 2 والطريقة 3 والطريقة 4 نفس الوقت.
بغض النظر عما إذا كانت الكتلة المتزامنة قد تم تنفيذها بشكل طبيعي أو خرجت من الكتلة المتزامنة بشكل غير طبيعي بسبب خطأ في البرنامج، فسيتم تحرير قفل المزامنة الذي تحتفظ به الكتلة المتزامنة الحالية تلقائيًا. لذلك، لا داعي للقلق بشأن تحرير أقفال المزامنة عند استخدام الكتل المتزامنة.
2. تزامن أساليب الطبقة الثابتة
لأنه عند استدعاء طريقة ثابتة، لا يتم بالضرورة إنشاء مثيل الكائن. ولذلك، لا يمكنك استخدام هذا لمزامنة الأساليب الثابتة، ولكن يجب عليك استخدام كائنات الفئة لمزامنة الأساليب الثابتة. الرمز هو كما يلي:
مزامنة الطرق الثابتة من خلال الكتل المتزامنة
انسخ رمز الكود كما يلي:
الفئة العامة StaticSyncBlock
{
طريقة الفراغ الثابت العام 1 ()
{
متزامن (StaticSyncBlock.class)
{
… …
}
}
طريقة الفراغ المتزامنة العامة الثابتة 2 ()
{
… …
}
}
عند مزامنة الأساليب الثابتة، يمكنك استخدام فئة الحقل الثابت للفئة للحصول على كائن الفئة. في المثال أعلاه، يمكن تنفيذ أسلوب واحد فقط من الأسلوب 1 والأسلوب 2 في نفس الوقت. بالإضافة إلى استخدام حقل الفئة للحصول على كائن الفئة، يمكنك أيضًا استخدام طريقة getClass للمثيل للحصول على كائن الفئة. يمكن تعديل الكود في المثال أعلاه كما يلي:
استخدم طريقة getClass للحصول على كائن Class
انسخ رمز الكود كما يلي:
الفئة العامة StaticSyncBlock
{
مثيل StaticSyncBlock العام الثابت؛
StaticSyncBlock العامة ()
{
مثيل = هذا؛
}
طريقة الفراغ الثابت العام 1 ()
{
متزامنة (instance.getClass())
{
}
}
}
في الكود أعلاه، يتم الحصول على مثيل لفئة StaticSyncBlock من خلال مثيل ثابت عام، ويتم الحصول على كائن Class من خلال طريقة getClass لهذا المثيل (تحصل جميع مثيلات الفئة على نفس كائن الفئة من خلال طريقة getClass، وبالتالي، استدعاء أي يمكن استخدام طريقة getClass للمثيل). يمكننا أيضًا مزامنة الأساليب الثابتة للفئات المختلفة من خلال كائنات الفئة، مثل طريقة الطريقة الثابتة لفئة الاختبار والطريقتين الثابتتين لفئة StaticSyncBlock، كما يلي:
تتم مزامنة طريقة طريقة فئة الاختبار مع طريقتي الطريقة 1 والطريقة 2 لفئة StaticSyncBlock.
انسخ رمز الكود كما يلي:
اختبار الطبقة العامة
{
طريقة الفراغ الثابت العامة ()
{
متزامن (StaticSyncBlock.class)
{
}
}
}
ملاحظة: عند استخدام أساليب فئة مزامنة الكتلة المتزامنة، يمكن للطرق غير الثابتة استخدام هذا للمزامنة، بينما يجب أن تستخدم الطرق الثابتة كائن الفئة للمزامنة. أنها لا تؤثر على بعضها البعض. بالطبع، يمكنك أيضًا استخدام كائنات الفئة بطرق غير ثابتة لمزامنة الطرق الثابتة. ولكن لا يمكن استخدام هذا في الطرق الثابتة لمزامنة الطرق غير الثابتة. تجدر الإشارة إلى ذلك عند استخدام أساليب فئة مزامنة الكتلة المتزامنة.