تم ذكر نمط الفحص المزدوج في المادة 48 من كتاب Java الفعال ، ويشار إلى أن هذا النمط لا ينطبق عادة في Java. هيكل هذا النمط كما يلي:
الموارد العامة getResource () {if (resource == null) {synchronized (this) {if (resource == null) {resource = new Resource () ؛ }}} مورد الإرجاع ؛ }هذا النمط هو تحسن في الكود التالي:
Resource GetResource () {if (resource == null) {resource = new Resource () ؛ مورد إرجاع ؛ }الغرض من هذا الرمز هو تأخير تهيئة الموارد. ولكن في كل مرة يمكنك الوصول إليها ، تحتاج إلى مزامنة. من أجل تقليل النفقات العامة للمزامنة ، يتوفر وضع الفحص المزدوج.
السبب في أن وضع الفحص المزدوج غير صالح في Java هو أن النوع المرجعي ليس آمنًا لخيط الخيط في غياب التزامن. بالنسبة للأنواع الأساسية باستثناء وضع فحص طويل ومزدوج ومزدوج ، ينطبق على وضع الفحص المزدوج. على سبيل المثال ، الكود التالي صحيح:
عدد int الخاص public int getCount () {if (count == 0) {synchronized (this) {if (count == 0) {count = computeCount () ؛ // حساب مستهلك للوقت}}} عدد الإرجاع ؛ }ما سبق هو الاستنتاج العام حول المصطلح المزدوج في جافا. لكن الأمور لم تنته بعد ، لأن نمط ذاكرة جافا يتم تحسينه أيضًا. كتب دوغ ليا في مقالته: "وفقًا لأحدث نموذج ذاكرة JSR133 Java ، إذا تم إعلان نوع المرجع على أنه متقلبة ، فسيعمل وضع الفحص المزدوج." لذلك في المستقبل ، تحتاج إلى استخدام وضع الفحص المزدوج في Java ، يمكنك استخدام الكود التالي:
موارد الموارد المتطايرة الخاصة ؛ الموارد العامة getResource () {if (resource == null) {synchronized (this) {if (resource == null) {resource = new Resource () ؛ }}} مورد الإرجاع ؛ }بالطبع ، يجب أن يكون في Java الذي يتبع مواصفات JSR133.
لذلك ، لا يتوفر فحص مزدوج في إصدارات J2Se 1.4 أو السابقة بسبب كتابة المكتبات خارج الطلب عند ضبطها في Thrated-Thergended أو JVM. تم إصلاح هذه المشكلة في J2SE 5.0 ، ويمكن استخدام الكلمة الرئيسية المتطايرة لضمان القمصان تحت متعدد الخيوط.
الطبقة العامة Singleton {مثيل خاص متطاير Singleton = null ؛ singleton public getInstance () {if (مثيل == null) {synchronized (this) {if (evalue == null) {easty = new singleton () ؛ }} مثيل الإرجاع ؛ }}الطريقة الموصى بها هي تهيئة حامل الطلب (IODH).
الطبقة العامة singleton {static class singletonholder {static singleton مثيل = جديد singleton () ؛ } Singleton GetInstance () {Return Singletonholder.instance ؛ }}ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون من المفيد للجميع تعلم برمجة Java.