ขณะที่พยายามที่จะเข้าใจว่าSubmissionPublisher( รหัสแหล่งที่มาใน Java SE 10 OpenJDK | เอกสาร ), คลาสใหม่เพิ่มเข้ามาใน Java SE ในรุ่นที่ 9 ได้รับการดำเนินฉัน stumbled ข้าม API โทรไม่กี่คนที่VarHandleฉันไม่ได้ก่อนหน้านี้ตระหนักถึง:
fullFence, acquireFence, releaseFence, และloadLoadFencestoreStoreFence
หลังจากทำวิจัยโดยเฉพาะอย่างยิ่งเกี่ยวกับแนวคิดของอุปสรรคหน่วยความจำ / รั้ว (ฉันเคยได้ยินพวกเขาก่อนหน้านี้ใช่ แต่ไม่เคยใช้พวกเขาจึงค่อนข้างไม่คุ้นเคยกับความหมายของพวกเขา) ฉันคิดว่าฉันมีความเข้าใจพื้นฐานของสิ่งที่พวกเขา . อย่างไรก็ตามเนื่องจากคำถามของฉันอาจเกิดขึ้นจากการเข้าใจผิดฉันต้องการให้แน่ใจว่าฉันได้รับมันตั้งแต่แรก:
อุปสรรคหน่วยความจำกำลัง จำกัด ข้อ จำกัด ใหม่เกี่ยวกับการอ่านและการเขียน
อุปสรรคหน่วยความจำสามารถแบ่งออกเป็นสองประเภทหลัก: อุปสรรคหน่วยความจำทิศทางเดียวและแบบสองทิศทางขึ้นอยู่กับว่าพวกเขาตั้งข้อ จำกัด ในการอ่านหรือเขียนหรือทั้งสองอย่าง
c ++ สนับสนุนความหลากหลายของปัญหาและอุปสรรคที่หน่วยความจำ
VarHandleแต่เหล่านี้ไม่ตรงกับผู้ที่ให้บริการโดย แต่บางส่วนของปัญหาและอุปสรรคที่หน่วยความจำที่มีอยู่ในVarHandleให้ผลกระทบการสั่งซื้อที่มีเข้ากันได้จะสอดคล้อง c ++ อุปสรรคหน่วยความจำของพวกเขา#fullFenceเข้ากันได้กับatomic_thread_fence(memory_order_seq_cst)#acquireFenceเข้ากันได้กับatomic_thread_fence(memory_order_acquire)#releaseFenceเข้ากันได้กับatomic_thread_fence(memory_order_release)#loadLoadFenceและ#storeStoreFenceไม่มีส่วนเคาน์เตอร์ C ++ ที่ใช้ร่วมกันได้
คำที่เข้ากันได้ดูเหมือนจะสำคัญมากที่นี่เนื่องจากความหมายแตกต่างกันอย่างชัดเจนเมื่อพูดถึงรายละเอียด ตัวอย่างเช่นอุปสรรค C ++ ทั้งหมดเป็นแบบสองทิศทางในขณะที่อุปสรรคของ Java ไม่ได้ (จำเป็น)
- อุปสรรคหน่วยความจำส่วนใหญ่ยังมีผลกระทบการประสาน สิ่งเหล่านั้นขึ้นอยู่กับชนิดของสิ่งกีดขวางที่ใช้และคำสั่งสิ่งกีดขวางที่เรียกใช้ก่อนหน้านี้ในเธรดอื่น เนื่องจากความหมายทั้งหมดของคำสั่งสิ่งกีดขวางมีเฉพาะฮาร์ดแวร์ฉันจะยึดติดกับสิ่งกีดขวางระดับสูง (C ++) ใน C ++ ตัวอย่างเช่นการเปลี่ยนแปลงที่ทำก่อนที่จะมีการเปิดตัวการเรียนการสอนอุปสรรคจะมองเห็นด้ายรันซื้อคำแนะนำและอุปสรรค
สมมติฐานของฉันถูกต้องหรือไม่ ถ้าเป็นเช่นนั้นคำถามที่ได้คือ:
อุปสรรคหน่วยความจำที่มีอยู่
VarHandleทำให้เกิดการประสานหน่วยความจำชนิดใด?ไม่ว่าจะเป็นสาเหตุของการซิงโครไนซ์หน่วยความจำหรือไม่สิ่งที่ข้อ จำกัด การเรียงลำดับใหม่อาจมีประโยชน์สำหรับใน Java Java Memory Model ให้การรับประกันที่แข็งแกร่งมากเกี่ยวกับการสั่งซื้อเมื่อฟิลด์ระเหยล็อคหรือ
VarHandleการดำเนินการ#compareAndSetที่เกี่ยวข้อง
ในกรณีที่คุณกำลังมองหาตัวอย่างข้างต้นBufferedSubscriptionคลาสภายในของSubmissionPublisher(แหล่งลิงก์ด้านบน) สร้างรั้วเต็มในบรรทัดที่ 1079 (ฟังก์ชั่นgrowAndAddเนื่องจากเว็บไซต์ที่เชื่อมโยงไม่รองรับตัวระบุส่วนเพียง CTRL + F สำหรับมัน ) อย่างไรก็ตามมันไม่ชัดเจนสำหรับฉันว่ามันมีไว้เพื่ออะไร
plain -> opaque -> release/acquire -> volatile (sequential consistency).