DateFormat Class هي فئة أمان غير متطورة. ذكرت وثيقة Javadocs أنه "لا يمكن مزامنة تنسيقات التاريخ. نوصي بإنشاء تنسيق تاريخ مستقل لكل مؤشر ترابط. إذا وصلت مؤشرات الترابط المتعددة إلى تنسيق تاريخ في نفس الوقت ، فهذا يحتاج إلى إضافة كتل التعليمات البرمجية المتزامنة إلى الخارج."
يوضح لنا الرمز التالي كيفية استخدام DateFormat في بيئة مؤشر ترابط لتحويل تاريخ السلسلة إلى كائن التاريخ. يعد إنشاء مثال للحصول على تنسيق التاريخ أكثر كفاءة ، لأن النظام لا يحتاج إلى الحصول على اللغات والبلدان المحلية عدة مرات.
DateFormattest {private Final DateFormat = New SimpleDateFormat ("Yyyymmdd") ؛
هذا الرمز غير متخلف. يمكننا أن نسميها من خلال خيوط متعددة. في الكود التالي ، قمت بإنشاء تجمع مؤشرات ترابط مع خيطين ، وقدمت 5 مهام تحويل التاريخ.
DateFormattest t = new DateFormattest () ؛ حالة الخيط. .out.println (result.get cure) ؛}
نتيجة تشغيل الرمز ليست كما كنا نتمنى أن تكون في بعض الأحيان ، فإنها تخرج التاريخ الصحيح ، وأحيانًا أخطاء الإخراج (مثل .SAT يوليو 31 00:00:00 بتوقيت بيرست 2012) ، وأحيانًا حتى رمي NumberFormatexception!
كيفية استخدام فئة DateFormat بشكل متزامن
يمكن أن يكون لدينا طرق متعددة لاستخدام فئة DateFormat عند أمان مؤشر الترابط.
1. متزامن
أسهل طريقة هي قفل كائن DateFormat قبل تحويل التاريخ. تتيح هذه الطريقة فقط مؤشر ترابط واحد للوصول إلى كائن DateFormat في وقت واحد ، في حين أن مؤشرات الترابط الأخرى لا يمكنها الانتظار إلا.
Date Date Convert (String Source) يلقي ParseException {Synchronized (Format) {Date D = Format.Pars (Source) ؛
2. استخدم ThreadLocal
هناك طريقة أخرى تتمثل في استخدام متغير ThreadLocal لاستيعاب كائن DateFormat ، مما يعني أن كل مؤشر ترابط يحتوي على نسخة تنتمي إلى خاصة بها ، ولا داعي للانتظار حتى يتم إطلاق مؤشرات الترابط الأخرى. ستكون هذه الطريقة أكثر كفاءة من استخدام الكتل المتزامنة.
الفئة العامة DateFormattest {private static Final ThreadLocal <df = new threadlocal <dateFormat> () {Override DateFormat () Return New SimpledAteFormat ("Yyyymmdd") ؛}} ؛ Date d = df.get ().
3. جودا الوقت
يعد Joda-Time تاريخًا رائعًا لمصدر JDK وبديل API التقويم.
استيراد org.joda.time.dateTime ؛ تحويل (مصدر السلسلة) {dateTime d = fmt.parsedateTime (Source) ؛