تحلل هذه المقالة استخدام مؤشرات الترابط المتعددة المتقلبة والمتزامنة في Java مع أمثلة. شاركها مع الجميع لتكون مرجعا لك. طريقة التنفيذ المحددة هي كما يلي:
انسخ الكود كما يلي: package com.chzhao;
الطبقة العامة Volatiletest تمتد الموضوع {
عدد صحيح ثابت خاص = 0 ؛
تشغيل الفراغ العام () {
العد++;
}
public static void main(String[] args) {
Thread threads[] = new Thread[10000];
لـ (int i = 0; i < Threads.length; i++) {
Threads[i] = new Volatiletest();
}
لـ (int i = 0; i < Threads.length; i++) {
المواضيع[i].start();
}
يحاول {
Thread.sleep(1000);
} قبض على (InterruptedException e) {
printStackTrace();
}
System.out.println(count);
}
}
الكود كما هو مذكور أعلاه. الإخراج المتوقع هو 10000. ومع ذلك، نظرًا لأن count++ ليس آمنًا لمؤشر الترابط، فغالبًا ما يكون الإخراج أقل من 10000.
لحل هذه المشكلة، تمت إضافة الكلمة الأساسية المتقلبة.
انسخ الكود كما يلي: package com.chzhao;
الطبقة العامة Volatiletest تمتد الموضوع {
عدد int الثابت الخاص المتقلب = 0 ؛
تشغيل الفراغ العام () {
العد++;
}
public static void main(String[] args) {
Thread threads[] = new Thread[10000];
لـ (int i = 0; i < Threads.length; i++) {
Threads[i] = new Volatiletest();
}
لـ (int i = 0; i < Threads.length; i++) {
المواضيع[i].start();
}
يحاول {
Thread.sleep(2000);
} قبض على (InterruptedException e) {
printStackTrace();
}
System.out.println(count);
}
}
بعد التعديل، غالبا ما يتم إخراج قيم أخرى غير 10000.
قم بتعديله إلى النموذج المتزامن، ويكون الكود كما يلي:
انسخ الكود كما يلي: package com.chzhao;
الطبقة العامة SynchronizedTest تمتد الموضوع {
عدد صحيح ثابت خاص = 0 ؛
تشغيل الفراغ العام () {
متزامن (LockClass.lock) {
العد++;
}
}
public static void main(String[] args) {
Thread threads[] = new Thread[10000];
لـ (int i = 0; i < Threads.length; i++) {
Threads[i] = new SynchronizedTest();
}
لـ (int i = 0; i < Threads.length; i++) {
المواضيع[i].start();
}
يحاول {
Thread.sleep(2000);
} قبض على (InterruptedException e) {
printStackTrace();
}
System.out.println(count);
}
}
انسخ الكود كما يلي: package com.chzhao;
فئة عامة LockClass {
البايت الثابت العام[] lock = new byte[0];
}
وبعد هذا التعديل يصبح الناتج 10000.
هل هذا يعني أن الكلمة الرئيسية المتقلبة عديمة الفائدة تمامًا؟ فقط المتزامنة يمكن أن تضمن سلامة الخيط؟
يوضح:
تحتوي لغة Java على آليتي مزامنة متأصلتين: الكتل (أو الأساليب) المتزامنة والمتغيرات المتطايرة. تم اقتراح كلا الآليتين لتحقيق سلامة خيط التعليمات البرمجية. تعد المتغيرات المتقلبة أقل تزامنًا (ولكنها في بعض الأحيان أبسط وأقل تكلفة)، كما أن استخدامها أكثر عرضة للخطأ. يمكن اعتبار المتغيرات المتطايرة في لغة جافا "أقل تزامنًا"؛ مقارنةً بالكتل المتزامنة، تتطلب المتغيرات المتطايرة ترميزًا أقل ولها وقت تشغيل أقل، ولكنها يمكن أن تحقق وظائف فقط جزء من المزامنة.
بمعنى آخر، في بعض الحالات، يكون استخدام volitile أكثر ملاءمة من المزامنة، ولكن بالطبع المزامنة أسوأ.
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.