ในบรรดาความรู้ด้านเกลียวใน Java โปรแกรมการขายตั๋วนั้นคลาสสิกมาก นอกจากนี้ยังมีปัญหาบางอย่างในโปรแกรม!
ข้อกำหนด: จำลอง 100 ตั๋วลดราคาในเวลาเดียวกันใน 3 หน้าต่าง
คำถามที่ 1: ทำไมมีการขายตั๋ว 300 ใบ?
เหตุผล: เนื่องจากตั๋วเป็นข้อมูลตัวแปรสมาชิกที่ไม่คงที่และไม่คงที่จะเก็บรักษาข้อมูลหนึ่งชิ้นในแต่ละวัตถุและจะมีสามชิ้นของวัตถุเธรดสามชิ้น
วิธีแก้ปัญหา: แบ่งปันหมายเลขตั๋วสำหรับวัตถุเธรดสามวัตถุ ใช้การดัดแปลงแบบคงที่
คำถามที่ 2: มีปัญหาด้านความปลอดภัยด้ายหรือไม่?
วิธีแก้ปัญหาความปลอดภัยด้าย: Sun ให้กลไกการซิงโครไนซ์ด้ายสำหรับเราในการแก้ปัญหาประเภทนี้
วิธีการซิงโครไนซ์กระทู้ Java:
วิธีที่ 1: ซิงโครไนซ์บล็อกโค้ด
วิธีที่ 2: ฟังก์ชั่นซิงโครนัส
Class SellTickets ขยายเธรด {ตั๋ว int แบบคงที่ = 1; // จำนวนโหวตจะต้องกำหนดเป็นแบบคงที่ที่นี่ มิฉะนั้นตัวแปรสมาชิกที่ไม่คงที่และข้อมูลตัวแปรสมาชิกที่ไม่คงที่จะรักษาชิ้นส่วนของข้อมูลในแต่ละวัตถุ จะมีสามสำเนาของวัตถุเธรดสาม SellTickets สาธารณะ (String ThreadName) {super (threadname); } โมฆะสาธารณะเรียกใช้ () {ในขณะที่ (จริง) {ซิงโครไนซ์ ("ล็อค") {ถ้า (ตั๋ว == 101) {// หรือถ้า (ตั๋ว> 100) {system.out.println ("ชื่อเรื่องถูกขายหมดแล้ว -_-... "); หยุดพัก; } system.out.println (thread.currentthread (). getName ()+"ขาย"+ตั๋ว+"ตั๋วหมายเลข"); ตั๋ว ++; /* ถ้า (ตั๋ว == 101) {// ผิด เมื่อตั๋ว == 101 มีเพียงหนึ่งเธรดที่กระโดดออกมา ตั๋ว ++ มีอยู่ในอีกสองเธรด หยุดพัก; } /* ถ้า (thread.currentthread (). getName (). เท่ากับ ("หน้าต่าง 2")) {// หน้าต่าง 2 สามารถขายได้ที่ตั๋วมากที่สุดเพียงใบเดียวเท่านั้น } */} //system.out.println(thread.currentthread (). getName ()+"ล็อค ... "); }}} คลาสสาธารณะ demo4 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// สร้างวัตถุเธรดสามวัตถุและจำลองสาม windows selltickets s1 = selltickets ใหม่ ("หน้าต่าง 1"); SellTickets S2 = SellTickets ใหม่ ("Window 2"); SellTickets S3 = SellTickets ใหม่ ("Window 3"); // เปิดเธรดตั๋ว S1.Start (); s2.start (); S3.Start (); System.out.println ("วิธีการหลัก ... "); -