1. อัลกอริธึมที่ไม่ปิดกั้น
อัลกอริธึมที่ไม่ปิดกั้นเป็นอัลกอริธึมที่ทำงานพร้อมกันซึ่งสามารถวางไข่เธรดได้อย่างปลอดภัยไม่ผ่านการล็อคการวางไข่ แต่ผ่านรูปแบบอะตอมมิกซิตีที่เป็นฮาร์ดแวร์ระดับต่ำ เช่น การเปรียบเทียบและการสลับ อัลกอริธึมแบบไม่บล็อกเป็นเรื่องยากมากในการออกแบบและใช้งาน แต่อัลกอริธึมเหล่านี้สามารถให้ปริมาณงานที่ดีขึ้นและการป้องกันที่ดีขึ้นต่อปัญหาการเอาชีวิตรอด เช่น การหยุดชะงักและการผกผันลำดับความสำคัญ ใช้คำสั่งเครื่องอะตอมมิกระดับต่ำเพื่อเปลี่ยนตัวล็อค เช่น การเปรียบเทียบและสลับ (CAS)
2. เทคโนโลยีในแง่ร้าย
การล็อคแบบเอกสิทธิ์เฉพาะบุคคลเป็นเทคนิคในแง่ร้าย โดยถือว่าสถานการณ์กรณีที่เลวร้ายที่สุดเกิดขึ้น (หากไม่ได้ล็อค เธรดอื่นจะทำลายสถานะของวัตถุ) และแม้ว่าสถานการณ์กรณีที่เลวร้ายที่สุดจะไม่เกิดขึ้น สถานะของวัตถุยังคงได้รับการคุ้มครองโดย ล็อค
3. เทคโนโลยีในแง่ดี
การตรวจสอบข้อขัดแย้งที่ขึ้นต่อกัน อัปเดตก่อน หากมีข้อขัดแย้งเกิดขึ้นระหว่างการตรวจสอบ ให้ยกเลิกการอัปเดตแล้วลองอีกครั้ง ไม่เช่นนั้นการอัปเดตจะสำเร็จ ในตอนนี้ โปรเซสเซอร์จะมีคำสั่งในการอ่าน-แก้ไข-เขียนแบบอะตอมมิก เช่น การเปรียบเทียบและสลับ (CAS) -และ- สลับ)
การดำเนินงาน 4.CAS
CAS มีตัวถูกดำเนินการ 3 ตัว ได้แก่ ค่าหน่วยความจำ V ค่าเก่าที่คาดหวัง A และค่าใหม่ที่จะแก้ไข B ถ้าเพียงแต่ว่าค่าที่คาดหวัง A และค่าหน่วยความจำ V เท่ากัน ให้แก้ไขค่าหน่วยความจำ V เป็น B ไม่เช่นนั้นไม่ต้องทำอะไรเลย รูปแบบการใช้งานโดยทั่วไปของ CAS คือ: ขั้นแรกให้อ่าน A จาก V แล้วคำนวณค่า B ใหม่โดยยึดตาม A จากนั้นใช้ CAS เพื่อเปลี่ยนค่าใน V จาก A เป็น B แบบอะตอมมิก (ตราบใดที่ไม่มีเธรดเปลี่ยนค่าของ V ในช่วงเวลานี้) ให้ค่าเป็นค่าอื่น)
รายการ 3. รหัสที่แสดงพฤติกรรม (แต่ไม่ใช่ประสิทธิภาพ) ของการเปรียบเทียบและสลับ คัดลอกโค้ดด้านล่าง:
SimulatedCAS คลาสสาธารณะ {
มูลค่า int ส่วนตัว
การซิงโครไนซ์สาธารณะ int getValue () { ค่าส่งคืน;
สาธารณะซิงโครไนซ์ int comparisonAndSwap (int คาดว่าค่า, int newValue) {
int oldValue = ค่า;
ถ้า (ค่า == ค่าที่คาดหวัง)
ค่า = ค่าใหม่;
คืนค่าเก่า;
-
-
รายการ 4. ใช้การเปรียบเทียบและการแลกเปลี่ยนเพื่อใช้รหัสคัดลอกเคาน์เตอร์
CasCounter คลาสสาธารณะ {
ค่า SimulatedCAS ส่วนตัว
สาธารณะ int getValue() {
ส่งคืนค่า.getValue();
-
การเพิ่ม int สาธารณะ () {
int oldValue = value.getValue();
ในขณะที่ (value.compareAndSwap(oldValue, oldValue + 1) != oldValue)
oldValue = value.getValue();
กลับค่าเก่า + 1;
-
-
5. ตัวแปรอะตอม
ตัวแปรอะตอมมิกรองรับการดำเนินการอัพเดตอะตอมมิกโดยไม่มีการป้องกันการล็อค และเลเยอร์พื้นฐานถูกนำมาใช้โดยใช้ CAS มีตัวแปรอะตอมมิกทั้งหมด 12 ตัว ซึ่งสามารถแบ่งออกเป็น 4 กลุ่ม ได้แก่ คลาสสเกลาร์ คลาสตัวอัปเดต คลาสอาร์เรย์ และคลาสตัวแปรคอมโพสิต ตัวแปรอะตอมมิกที่ใช้กันมากที่สุดคือคลาสสเกลาร์: AtomicInteger, AtomicLong, AtomicBoolean และ AtomicReference CAS รองรับทุกประเภท
6. การเปรียบเทียบประสิทธิภาพ: ล็อคและตัวแปรอะตอม
ภายใต้ความขัดแย้งระดับต่ำถึงปานกลาง ตัวแปรอะตอมมิกสามารถให้ความสามารถในการปรับขยายได้สูงและประสิทธิภาพของตัวแปรอะตอมมิกเกินกว่าการล็อค ภายใต้ความขัดแย้งที่มีความเข้มข้นสูง การล็อคสามารถหลีกเลี่ยงการโต้แย้งได้อย่างมีประสิทธิภาพมากขึ้น และประสิทธิภาพของการล็อคจะเกินประสิทธิภาพของอะตอม ตัวแปร แต่ในสถานการณ์จริงที่สมจริงยิ่งขึ้น ประสิทธิภาพของตัวแปรอะตอมจะเกินประสิทธิภาพของล็อค