คุณสังเกตเห็นสภาพการแข่งขันในตัวอย่าง Java Multi-threading Concurrency หรือไม่? จะจัดการกับมันอย่างไร?

เผยแพร่แล้ว: 2019-12-11

มีคุณสังเกตเห็นการแข่งขันเงื่อนไขในจาวา multi-threading-concurrency-example

เมื่อก่อนฉันได้เขียนบทความเกี่ยวกับตัวอย่างผู้บริโภคของผู้ผลิตและวิธีจัดการการอ่าน/เขียนวิธีที่ดีกว่าใน Java ในบันทึกที่คล้ายกัน ในบทช่วยสอนนี้ เราจะพูดถึงบางอย่างเกี่ยวกับ Race Condition และ Thread locking

หากคุณมีคำถามใด ๆ ด้านล่างแสดงว่าคุณมาถูกที่แล้ว:

  • ตัวอย่างสภาพการแข่งขัน Java
  • ตัวอย่าง mutex java
  • มัลติเธรด – สภาวะการแข่งขันคืออะไร?
  • เงื่อนไขการแข่งขันและส่วนสำคัญ
  • สภาพการแข่งขันคืออะไร?
  • วิธีจัดการกับ Race Condition ใน Java ด้วย Example

ทำไมสภาพการแข่งขันใน Java เกิดขึ้น?

สภาพการแข่งขันใน Java เกิดขึ้นเมื่อ two or more threads ไปพยายามแก้ไข/อัปเดตข้อมูลที่แชร์พร้อม same time

ลองดูที่ด้านล่าง ตรรกะของโปรแกรม:

นี่เป็นตัวอย่างการธนาคารที่ง่ายมากที่คุณจะ deposit และ withdraw จำนวน 100 times คุณจะฝากเงิน $100 ทั้งหมด 100 ครั้ง = $100 x 100 = $10,000 และคุณจะถอน $50 ทั้งหมด 100 ครั้ง = $50 x 100 = $5,000 เมื่อสิ้นสุดโปรแกรม คุณควรมีเงิน $5,000 ในธนาคารของคุณ

นี่คือขั้นตอน:

  1. สร้างคลาส CrunchifyRaceCondition.java
  2. สร้างคลาส CrunchifyTransaction.java
  3. สร้างคลาส CrunchifyBankAccount.java
  4. เราจะเรียกใช้คลาส CrunchifyRaceCondition และจะเริ่มการฝากและถอนลูป 100 ครั้ง
  5. เราจะเรียกใช้ with Synchronized block เพื่อตรวจสอบผลลัพธ์
  6. เราจะเรียกใช้ without Synchronized block เพื่อตรวจสอบผลลัพธ์

CrunchifyRaceCondition.java

CrunchifyTransaction.java

CrunchifyBankAccount.java

โปรดตรวจสอบบรรทัดที่ 24 และ 34 ด้านบน เก็บคีย์เวิร์ดที่ Synchronized ไว้และเรียกใช้โปรแกรมของคุณ คุณควรเห็นผลลัพธ์ที่ถูกต้องตามที่เห็นในภาพด้านล่าง

Java Synchronized Block Keyword - Crunchify

ตอนนี้ลบคำหลักที่ซิงโครไนซ์ออกจากบรรทัดที่ 24 และ 34 แล้วรันโปรแกรมเดียวกัน

คุณอาจต้องเรียกใช้โปรแกรมนี้หลายครั้งเพื่อดูปัญหา ใน java ไม่มีการรับประกันว่าคุณจะเห็น Race condition ตลอดเวลา

Java ที่ไม่มีคีย์เวิร์ดที่ถูกบล็อกที่ซิงโครไนซ์ - Crunchify

หากคุณมีแอปพลิเคชันระดับองค์กรและคุณกำลังพูดถึงธุรกรรมหลายล้านรายการต่อวินาที สภาวะการแข่งขันอาจทำให้เกิดหายนะสำหรับบริษัทของคุณ

ตอนนี้คำถามคือจะหลีกเลี่ยง Race Condition ในแอปพลิเคชัน Java ของคุณได้อย่างไร

  1. ถ้าสภาวะการแย่งชิงอยู่ในการอัพเดตโครงสร้างข้อมูลในหน่วยความจำที่ใช้ร่วมกันบางตัว คุณต้องซิงโครไนซ์การเข้าถึงและอัพเดตโครงสร้างข้อมูลด้วยวิธีที่เหมาะสม
  2. หากสภาวะการแย่งชิงอยู่ในการอัปเดตฐานข้อมูลของคุณ คุณต้องปรับโครงสร้าง SQL ของคุณใหม่เพื่อใช้ธุรกรรมในระดับความละเอียดที่เหมาะสม
  3. ไม่ควรทำการทดสอบโหลดก่อนใช้งานจริงในเวอร์ชันที่ใช้งานจริง โหลดมากขึ้นอาจทำให้สภาพการแข่งขันหายาก แก้ก่อนดีกว่าค่อยมาแก้ทีหลัง
  4. ตรวจสอบให้แน่ใจว่าคุณไม่มีตัวแปรส่วนกลางที่คุณเขียนถึง
  5. ใน Java ทุกอ็อบเจ็กต์มีเพียงหนึ่งมอนิเตอร์และ mutex ที่เชื่อมโยงอยู่ จอภาพเดียวมีประตูหลายบาน อย่างไรก็ตาม แต่ละจอระบุด้วยคีย์เวิร์ดที่ synchronized เมื่อเธรดผ่านคีย์เวิร์ดที่ synchronized มันจะล็อกประตูทั้งหมดอย่างมีประสิทธิภาพ
  6. แน่นอน ถ้าเธรดไม่ผ่านระหว่างคีย์เวิร์ดที่ synchronized เธรดนั้นก็ไม่ได้ล็อคประตู และเธรดอื่นๆ บางส่วนก็อาจเข้ามาฟรีได้ทุกเมื่อ