Kotlin Multiplatform Academy · บทเรียน

สถานะที่เปลี่ยนแปลงได้และเงื่อนไขแข่งขัน

ปกป้องสถานะร่วมที่เปลี่ยนแปลงได้ข้ามเธรด

บทเรียน 3 จาก 413 ขั้นตอน

สถานะที่เปลี่ยนแปลงได้และเงื่อนไขแข่งขัน เป็นบทเรียน Kotlin Multiplatform Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Multiplatform Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Multiplatform Academy มีบทเรียนทั้งหมด 4 บทเรียน

สถานะที่ใช้ร่วมกันมีความเสี่ยง

เมื่อสองเธรดเข้าถึงสถานะที่เปลี่ยนแปลงได้เดียวกัน ผลลัพธ์จะขึ้นอยู่กับจังหวะเวลา ความคาดเดาไม่ได้นี้เป็นต้นเหตุของข้อผิดพลาดที่แอบแฝง

เงื่อนไขการแข่งขันคืออะไร

เงื่อนไขการแข่งขันเกิดขึ้นเมื่อผลลัพธ์ขึ้นอยู่กับว่าเธรดใดทำงานก่อน โค้ดเดียวกันอาจผ่านในครั้งหนึ่งและล้มเหลวในครั้งถัดไป

การอัปเดตที่สูญหายแบบคลาสสิก

เธรดสองเธรดอ่านตัวนับ ทั้งคู่บวกหนึ่ง แล้วการเขียนครั้งหนึ่งเขียนทับอีกครั้งหนึ่ง คุณคาดว่าจะได้การเพิ่มสองครั้ง แต่กลับได้เพียงครั้งเดียว

count = count + 1

ยังเกิดขึ้นได้แม้มีตัวจัดการใหม่

ตัวจัดการหน่วยความจำแบบใหม่ยกเลิกการทำให้อ็อบเจ็กต์หยุดเปลี่ยนแปลง แต่ไม่ได้ยกเลิกเงื่อนไขการแข่งขัน การเขียนโดยไม่ซิงโครไนซ์ยังคงไม่ปลอดภัยบนทุกแพลตฟอร์ม

จำกัดสถานะไว้ที่เธรดเดียว

วิธีแก้ที่ง่ายที่สุดคือการจำกัดขอบเขต: ให้เธรดเดียวเป็นเจ้าของข้อมูลที่เปลี่ยนแปลงได้ เธรดอื่นควรส่งข้อความแทนการเขียนข้อมูลโดยตรง

ใช้ภาพสถานะที่เปลี่ยนแปลงไม่ได้

ควรเลือกค่าแบบเปลี่ยนแปลงไม่ได้ที่แทนที่ทั้งชุด การสลับการอ้างอิงหนึ่งรายการเป็นการทำงานแบบอะตอมิก ผู้อ่านจึงไม่เห็นอ็อบเจ็กต์ที่อัปเดตเพียงบางส่วน

state = state.copy(count = state.count + 1)

โครูทีนร่วมกับ Mutex

สำหรับการเขียนข้อมูลที่ใช้ร่วมกัน Mutex จะอนุญาตให้โครูทีนเข้าใช้งานได้ครั้งละหนึ่งตัว และพักการทำงานของตัวอื่นแทนการบล็อกเธรด

mutex.withLock { count += 1 }

มีตัวช่วยแบบอะตอมิก

สำหรับตัวนับเพียงตัวเดียว ตัวครอบแบบอะตอมิกจะอัปเดตได้อย่างปลอดภัยโดยไม่ต้องใช้ล็อก และคอมไพล์เป็นการดำเนินการอะตอมิกแบบเนทีฟบนแต่ละเป้าหมาย

val counter = atomic(0)

StateFlow ที่มีผู้เขียนเพียงรายเดียว

การส่งการอัปเดตผ่าน StateFlow เพียงตัวเดียวหมายความว่ามีแหล่งเดียวที่เขียนสถานะ ตัวรวบรวมหลายตัวสามารถอ่านได้ แต่การเขียนยังคงประสานงานกัน

_state.value = _state.value.copy(busy = true)

ทดสอบภายใต้แรงกดดัน

เงื่อนไขการแข่งขันมักซ่อนอยู่จนกว่าจะมีโหลดสูง ให้เรียกใช้ตรรกะที่ใช้ร่วมกันจากโครูทีนจำนวนมากในการทดสอบ เพื่อค้นหาข้อผิดพลาดด้านจังหวะเวลาก่อนผู้ใช้จะพบ

ออกแบบเพื่อกำจัดปัญหา

เงื่อนไขการแข่งขันที่ดีที่สุดคือเงื่อนไขที่คุณไม่เคยสร้างขึ้นมา เลือกใช้ความไม่เปลี่ยนแปลงและเจ้าของเพียงรายเดียว แล้วข้อผิดพลาดด้านการทำงานพร้อมกันส่วนใหญ่จะหายไปเอง ✅

ตรวจสอบอย่างรวดเร็ว

ตรวจสอบความเข้าใจเกี่ยวกับสถานะที่ใช้ร่วมกันอย่างปลอดภัย

สรุป

ตอนนี้คุณสามารถระบุเงื่อนไขการแข่งขันและแก้ไขได้ด้วยการจำกัดขอบเขต ภาพสถานะที่เปลี่ยนแปลงไม่ได้ Mutex หรือตัวแปรอะตอมิก 🎉

เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “สถานะที่เปลี่ยนแปลงได้และเงื่อนไขแข่งขัน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “สถานะที่เปลี่ยนแปลงได้และเงื่อนไขแข่งขัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Multiplatform Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Multiplatform Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “สถานะที่เปลี่ยนแปลงได้และเงื่อนไขแข่งขัน”

ปกป้องสถานะร่วมที่เปลี่ยนแปลงได้ข้ามเธรด คุณปฏิบัติ Kotlin Multiplatform Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Multiplatform Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Multiplatform Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “สถานะที่เปลี่ยนแปลงได้และเงื่อนไขแข่งขัน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Multiplatform Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Multiplatform Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. อธิบายตัวจัดการหน่วยความจำแบบใหม่
  2. เธรดหลักและเบื้องหลังบน iOS
  3. สถานะที่เปลี่ยนแปลงได้และเงื่อนไขแข่งขัน
  4. แก้ปัญหาการตรึงและแครชจากเธรด
← กลับไปที่ Kotlin Multiplatform Academy