من بين معرفة الخيوط في جافا ، برامج مبيعات التذاكر كلاسيكية للغاية. هناك أيضا بعض المشاكل في البرنامج!
المتطلبات: محاكاة 100 تذكرة للبيع في نفس الوقت في 3 Windows.
السؤال 1: لماذا تباع 300 تذكرة؟
السبب: نظرًا لأن التذاكر غير استاتيكية ، فإن البيانات المتغيرة غير القابلة للاتصالات ستحافظ على جزء واحد من البيانات في كل كائن ، وسيكون هناك ثلاث قطع من ثلاث كائنات مؤشر ترابط.
الحل: شارك رقم التذاكر لثلاثة كائنات مؤشر ترابط. استخدام تعديل ثابت.
السؤال 2: هل هناك مشكلة في سلامة الموضوع؟
حل لمشاكل السلامة في مؤشر الترابط: توفر Sun آلية مزامنة الخيط بالنسبة لنا لحل هذا النوع من المشكلات.
كيفية مزامنة خيوط Java:
الطريقة 1: مزامنة كتل الكود
الطريقة 2: وظيفة متزامنة
يمتد SellTickets الفئة Thread {Static Int Tickets = 1 ؛ // يجب تعريف عدد الأصوات على أنها ثابتة هنا. خلاف ذلك ، فإن متغيرات الأعضاء غير القتالية والبيانات المتغيرة للأعضاء غير القديم ستحافظ على جزء من البيانات في كل كائن. سيكون هناك ثلاث نسخ من ثلاث كائنات مؤشرات ترابط. selltickets العامة (سلسلة threadname) {super (threadname) ؛ } public void run () {بينما (true) {synchronized ("lock") {if (tickets == 101) {// أو if (tickets> 100) {system.out.println ("تم بيع العناوين -__-...") ؛ استراحة؛ } system.out.println (thread.currentThRead (). getName ()+"بيع"+تذاكر+"تذكرة الرقم") ؛ تذاكر ++ ؛ /* if (التذاكر == 101) {// خطأ. عندما تذكرة == 101 ، يقفز موضوع واحد فقط. Tickets ++ موجود في الخيوط الأخرى. استراحة؛ } /* if (thread.currentThRead (). getName (). يساوي ("window 2")) {// window 2 يمكن أن يبيع فقط في تذكرة واحدة فقط ، والاستراحة قد انتهت ؛ } */} //system.out.println(thread.currentThread (). getName ()+"lock ...") ؛ }}} demo4 {public static void main (string [] args) {// إنشاء ثلاثة كائنات مؤشرات ترابط ومحاكاة ثلاثة windows selltickets s1 = new selltickets ("window 1") ؛ SellTickets S2 = New SellTickets ("Window 2") ؛ SellTickets S3 = New SellTickets ("Window 3") ؛ // Open Thread Ticketing S1.Start () ؛ s2.start () ؛ S3.start () ؛ System.out.println ("الطريقة الرئيسية ...") ؛ }}