"สวัสดี Amigo! เมื่อวานเราได้พูดถึงประโยชน์และความสะดวกของมัลติเธรด ตอนนี้ได้เวลาดูข้อเสียแล้ว โชคไม่ดีที่พวกมันไม่เล็ก"
ก่อนหน้านี้ เรามองว่าโปรแกรมเป็นชุดของวัตถุที่เรียกใช้เมธอดของกันและกัน ตอนนี้ทุกอย่างซับซ้อนขึ้นเล็กน้อย โปรแกรมเป็นเหมือนชุดของวัตถุที่มี "หุ่นยนต์ขนาดเล็ก" (เธรด) หลายตัวที่คลานผ่านโปรแกรมและดำเนินการคำสั่งที่มีอยู่ในเมธอด
การตีความใหม่นี้ไม่ได้ยกเลิกการตีความครั้งแรก พวกเขายังคงเป็นวัตถุและยังคงเรียกวิธีการของกันและกัน แต่เราต้องจำไว้ว่ามีหลายเธรด และแต่ละเธรดมีหน้าที่หรือภารกิจของตัวเอง
โปรแกรมมีความซับซ้อนมากขึ้น เธรดต่างๆ จะเปลี่ยนสถานะของออบเจกต์ต่างๆ ตามงานที่ดำเนินการ และสามารถเหยียบเท้ากันได้
แต่สิ่งที่เลวร้ายที่สุดเกิดขึ้นภายในเครื่อง Java อย่างที่ฉันได้กล่าวไปแล้ว การเกิดขึ้นพร้อมกันของเธรดนั้นเกิดขึ้นได้จากการที่โปรเซสเซอร์เปลี่ยนจากเธรดหนึ่งไปยังอีกเธรดหนึ่งอย่างต่อเนื่อง มันสลับเป็นเธรด ทำงานเป็นเวลา 10 มิลลิวินาที สลับไปยังเธรดถัดไป ทำงานเป็นเวลา 10 มิลลิวินาที และอื่นๆ และนี่คือปัญหา: สวิตช์เหล่านี้อาจเกิดขึ้นในช่วงเวลาที่ไม่เหมาะสมที่สุด พิจารณาตัวอย่างนี้:
รหัสของเธรดแรก | รหัสของเธรดที่สอง |
---|---|
|
|
สิ่งที่เราคาดว่าจะแสดง |
---|
นิคอายุ 15 ปี ลีนาอายุ 21 ปี |
การดำเนินการโค้ดจริง | รหัสของเธรดแรก | รหัสของเธรดที่สอง |
---|---|---|
|
|
|
สิ่งที่แสดงจริง |
---|
Nick ชื่อ Lena อายุ15 ปี 21 ปี |
และนี่คืออีกตัวอย่างหนึ่ง:
รหัส | คำอธิบาย |
---|---|
|
วิธีการสลับswap ค่าของตัวแปรname1 และname2
จะเกิดอะไรขึ้นหากมีการเรียกจากสองเธรดในเวลาเดียวกัน |
การดำเนินการโค้ดจริง | รหัสของเธรดแรก | รหัสของเธรดที่สอง |
---|---|---|
|
|
|
บรรทัดล่างสุด |
---|
ตัวแปรทั้งสองมีค่า «Lena» วัตถุ «พันธมิตร» ไม่ได้สร้างมันขึ้นมา มันหายไป |
"ใครจะคาดคิดว่าข้อผิดพลาดเช่นนี้เกิดขึ้นได้ด้วยการดำเนินการมอบหมายง่ายๆ เช่นนี้!"
"ใช่ ปัญหานี้มีทางแก้ไข แต่เราจะพูดถึงเรื่องนี้ในภายหลัง คอของฉันแห้ง"
GO TO FULL VERSION