ขณะที่พยายามที่จะเข้าใจว่าSubmissionPublisher
( รหัสแหล่งที่มาใน Java SE 10 OpenJDK | เอกสาร ), คลาสใหม่เพิ่มเข้ามาใน Java SE ในรุ่นที่ 9 ได้รับการดำเนินฉัน stumbled ข้าม API โทรไม่กี่คนที่VarHandle
ฉันไม่ได้ก่อนหน้านี้ตระหนักถึง:
fullFence
, acquireFence
, releaseFence
, และloadLoadFence
storeStoreFence
หลังจากทำวิจัยโดยเฉพาะอย่างยิ่งเกี่ยวกับแนวคิดของอุปสรรคหน่วยความจำ / รั้ว (ฉันเคยได้ยินพวกเขาก่อนหน้านี้ใช่ แต่ไม่เคยใช้พวกเขาจึงค่อนข้างไม่คุ้นเคยกับความหมายของพวกเขา) ฉันคิดว่าฉันมีความเข้าใจพื้นฐานของสิ่งที่พวกเขา . อย่างไรก็ตามเนื่องจากคำถามของฉันอาจเกิดขึ้นจากการเข้าใจผิดฉันต้องการให้แน่ใจว่าฉันได้รับมันตั้งแต่แรก:
อุปสรรคหน่วยความจำกำลัง จำกัด ข้อ จำกัด ใหม่เกี่ยวกับการอ่านและการเขียน
อุปสรรคหน่วยความจำสามารถแบ่งออกเป็นสองประเภทหลัก: อุปสรรคหน่วยความจำทิศทางเดียวและแบบสองทิศทางขึ้นอยู่กับว่าพวกเขาตั้งข้อ จำกัด ในการอ่านหรือเขียนหรือทั้งสองอย่าง
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)
.