أولا اكتب حالة واحدة:
الطبقة العامة singledemo {private static singledemo s = null ؛ خاص singledemo () {} static static singlemo getInstance () {if (s == null) {s = new SingleMo () ؛ } العودة s ؛ }}اكتب فئة اختبار:
الفئة العامة threaddemo3 {public static void main (string [] args) {singledemo s1 = singledemo.getInstance () ؛ Synedemo s2 = singledemo.getInstance () ؛ System.out.println (S2 == S2) ؛ }}النتيجة الجارية صحيحة دائمًا ، مما يعني أنه لا توجد مشكلة تحت موضوع واحد. دعنا نكتب سلسلة متعددة للوصول إلى الحالة الفردية.
يقوم Threadtest Public Classe بتنفيذ Runnable {// تخزين كائنات Singleton ، باستخدام Set هو عدم تخزين العناصر المكررة مجموعة عامة <SandledEmo> Singles = New Hashset <SingleDemo> () ؛ Override public void run () {// get singledemo s = singledemo.getInstance () ؛ // إضافة Singleton Singles.Add (s) ؛ }}استخدم وصول متزامن متعدد مؤشرات الترابط إلى المفردات:
الفئة العامة threaddemo3 {public static void main (string [] args) {// singledemo s1 = singledemo.getInstance () ؛ // singledemo s2 = singledemo.getInstance () ؛ // system.out.println (S2 == S2) ؛ threadtest t = new threadtest () ؛ موضوع جديد (t) .start () ؛ موضوع جديد (t) .start () ؛ موضوع جديد (t) .start () ؛ موضوع جديد (t) .start () ؛ موضوع جديد (t) .start () ؛ موضوع جديد (t) .start () ؛ موضوع جديد (t) .start () ؛ موضوع جديد (t) .start () ؛ موضوع جديد (t) .start () ؛ System.out.println (T.Singles) ؛ }}
نتائج التشغيل كما يلي:
[com.persagy.thread.singledemo@1bc4459 ، com.persagy.thread.singledemo@150bd4d]
أو
[com.persagy.thread.singledemo@12b6651]
وهذا يعني أن هناك مشكلة أمان وصول متزامنة الخيوط ، وقد لا تكون الحالات التي تم الحصول عليها هي نفسها
كيف تحل مشاكل السلامة في الموضوع؟
بالطبع ، يتم استخدام آلية قفل التزامن.
فيما يلي تحسن في المفرد:
الطبقة العامة singledemo {private static singledemo s = null ؛ private singledemo () {} singlemo getInstance () {if (s == null) {s = new SingleMo () ؛} return s ؛}} تم حل مشكلة سلامة الخيط بعد إضافة الوظيفة المتزامنة
قم بتشغيل عدة مرات للحصول على نفس الحالة ، ولن تكون هناك حالتين.
[com.persagy.thread.singledemo@12b6651]
ومع ذلك ، في حالة الوصول المتزامن متعدد الخيوط ، يجب على كل مؤشر ترابط الحكم على القفل في كل مرة يكتسب فيها مثيلًا ، وهو كفاءة منخفضة نسبيًا. من أجل تحسين الكفاءة ، أضفت طريقة حكم مزدوجة لحل مشكلة الكفاءة
الرمز كما يلي:
الطبقة العامة singledemo {private static singledemo s = null ؛ private singledemo () {} SingleMo SingleMo GetInstance () {/ * إذا كان الخيط الأول يحصل على كائن المثيل في المفرد ، * عندما يحصل الخيط اللاحق على المثيل ، فإنه لا يلزم الدخول إلى كتلة رمز التزامن. */if (s == null) {// القفل المستخدم في كتلة رمز التزامن هو كائن ملف bytecode في المفرد ، ويمكن استخدام هذا القفل فقط متزامن (singledemo.class) {if (s == null) {s = new Singledemo () ؛}}}}}}}}}}}}}}}}}هذه الطريقة تحل مشكلة سلامة الخيط للأشخاص الكسولون ويحسن الكفاءة. ومع ذلك ، في التطور الفعلي ، يستخدم المزيد من الناس جائعين. بعد كل شيء ، هذا الرمز أكثر تعقيدًا وتعقيدًا.
ما سبق هو المحتوى الكامل للحل الأمثل لمشكلة سلامة الخيط الكسول في وضع تصميم حالة واحدة يجلبه لك المحرر. آمل أن يدعم الجميع wulin.com أكثر ~