คำถามติดแท็ก volatile

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

22
คำหลักที่ระเหยง่ายมีประโยชน์สำหรับอะไร
ที่ทำงานวันนี้ฉันเจอvolatileคำค้นหาในชวา ไม่คุ้นเคยกับมันฉันพบคำอธิบายนี้: ทฤษฎีและการปฏิบัติของ Java: การจัดการความผันผวน ระบุรายละเอียดที่บทความนั้นอธิบายคำหลักที่เป็นปัญหาคุณเคยใช้หรือเคยเห็นกรณีที่คุณสามารถใช้คำหลักนี้ในลักษณะที่ถูกต้องหรือไม่

9
ระเหยกับลูกโซ่กับล็อค
สมมติว่าคลาสมีpublic int counterฟิลด์ที่เข้าถึงได้โดยหลายเธรด นี่intเป็นเพียงการเพิ่มหรือลดเท่านั้น หากต้องการเพิ่มฟิลด์นี้ควรใช้วิธีการใดและเพราะเหตุใด lock(this.locker) this.counter++;, Interlocked.Increment(ref this.counter);, เปลี่ยนการปรับปรุงการเข้าถึงการcounterpublic volatile ตอนนี้ที่ผมได้ค้นพบvolatileฉันได้รับการลบหลายงบและการใช้งานของlock Interlockedแต่มีเหตุผลที่จะไม่ทำเช่นนี้หรือไม่?


7
อะไรคือความแตกต่างระหว่างอะตอม / ระเหย / ซิงโครไนซ์?
อะตอม / ระเหย / ซิงโครไนซ์ทำงานอย่างไรภายใน ความแตกต่างระหว่างบล็อครหัสต่อไปนี้คืออะไร? รหัส 1 private int counter; public int getNextUniqueIndex() { return counter++; } รหัส 2 private AtomicInteger counter; public int getNextUniqueIndex() { return counter.getAndIncrement(); } รหัส 3 private volatile int counter; public int getNextUniqueIndex() { return counter++; } ไม่volatileทำงานในลักษณะดังต่อไปนี้หรือไม่? คือ volatile int i = 0; …

8
Volatile vs Static ใน Java
มันถูกต้องหรือไม่ที่จะบอกว่านั่นstaticหมายถึงหนึ่งสำเนาของค่าสำหรับวัตถุทั้งหมดและvolatileหมายถึงหนึ่งสำเนาของค่าสำหรับเธรดทั้งหมดหรือไม่ อย่างไรก็ตามstaticค่าตัวแปรก็จะเป็นหนึ่งค่าสำหรับกระทู้ทั้งหมดแล้วทำไมเราควรจะไปvolatile?


4
ความแตกต่างระหว่างสารระเหยและซิงโครไนซ์ใน Java
ฉันสงสัยว่าความแตกต่างระหว่างการประกาศตัวแปรเป็นvolatileและการเข้าถึงตัวแปรในsynchronized(this)บล็อกใน Java หรือไม่? ตามบทความนี้http://www.javamex.com/tutorials/synchronization_volatile.shtmlมีหลายสิ่งที่ต้องพูดและมีความแตกต่างมากมาย แต่ก็มีความคล้ายคลึงกันบ้าง ฉันสนใจข้อมูลนี้เป็นพิเศษ: ... การเข้าถึงตัวแปรที่เปลี่ยนแปลงได้ไม่เคยมีศักยภาพในการบล็อก: เราเพียง แต่ทำการอ่านหรือเขียนอย่างง่าย ๆ เท่านั้นซึ่งแตกต่างจากบล็อกที่ซิงโครไนซ์ที่เราจะไม่ยึดติดกับล็อคใด ๆ เนื่องจากการเข้าถึงตัวแปรระเหยไม่เคยมีการล็อคจึงไม่เหมาะสำหรับกรณีที่เราต้องการอ่าน - อัปเดต - เขียนเป็นปฏิบัติการอะตอมมิก (เว้นแต่ว่าเราพร้อมที่จะ "พลาดการอัพเดท"); พวกเขาหมายถึงอะไรโดยread-update-write ? การเขียนนั้นเป็นการอัปเดตหรือหมายความว่าการอัปเดตนั้นเป็นการเขียนที่ขึ้นอยู่กับการอ่านด้วยหรือไม่ ส่วนใหญ่แล้วเมื่อใดที่เหมาะสมที่จะประกาศตัวแปรvolatileมากกว่าเข้าถึงตัวแปรเหล่านั้นผ่านsynchronizedบล็อก? เป็นความคิดที่ดีที่จะใช้volatileกับตัวแปรที่ขึ้นอยู่กับอินพุตหรือไม่? ตัวอย่างเช่นมีตัวแปรที่เรียกrenderว่าอ่านห่วงการเรนเดอร์และตั้งค่าโดยเหตุการณ์ keypress หรือไม่


9
เหตุใดความผันผวนจึงไม่ถือว่ามีประโยชน์ในการเขียนโปรแกรม C หรือ C ++ แบบมัลติเธรด
ดังที่แสดงในคำตอบที่ฉันเพิ่งโพสต์เมื่อเร็ว ๆ นี้ดูเหมือนว่าฉันจะสับสนเกี่ยวกับยูทิลิตี้ (หรือขาดของมัน) volatileในบริบทการเขียนโปรแกรมแบบมัลติเธรด volatileความเข้าใจของฉันนี้เวลาใดตัวแปรอาจมีการเปลี่ยนแปลงนอกไหลของการควบคุมของชิ้นส่วนของรหัสเข้าถึงมันว่าตัวแปรที่ควรได้รับการประกาศให้เป็น ตัวจัดการสัญญาณการลงทะเบียน I / O และตัวแปรที่แก้ไขโดยเธรดอื่นทั้งหมดล้วนเป็นสถานการณ์ดังกล่าว ดังนั้นถ้าคุณมี int ส่วนกลางfooและfooถูกอ่านโดยหนึ่งเธรดและตั้งค่าเป็นอะตอมต่อโดยเธรดอื่น (อาจใช้คำสั่งเครื่องที่เหมาะสม) เธรดการอ่านจะเห็นสถานการณ์นี้ในแบบเดียวกับที่มันเห็นตัวแปร tweaked โดยตัวจัดการสัญญาณหรือ แก้ไขโดยเงื่อนไขฮาร์ดแวร์ภายนอกและดังนั้นจึงfooควรประกาศvolatile(หรือสำหรับสถานการณ์แบบมัลติเธรดเข้าถึงได้ด้วยโหลดหน่วยความจำไม่พอใจซึ่งน่าจะเป็นทางออกที่ดีกว่า) ฉันผิดและอยู่ที่ไหน

5
เมื่อใดควรใช้สารระเหยร่วมกับเธรดหลายตัว?
หากมีเธรดสองเธรดที่เข้าถึงตัวแปรโกลบอลบทช่วยสอนจำนวนมากบอกว่าทำให้ตัวแปรระเหยเพื่อป้องกันไม่ให้คอมไพลเลอร์แคชตัวแปรในรีจิสเตอร์และทำให้ไม่ได้รับการอัพเดตอย่างถูกต้อง อย่างไรก็ตามสองเธรดทั้งสองเข้าถึงตัวแปรที่ใช้ร่วมกันเป็นสิ่งที่เรียกร้องให้มีการป้องกันผ่าน mutex ไม่ใช่เหรอ? แต่ในกรณีนั้นระหว่างการล็อกเธรดและการปล่อย mutex รหัสจะอยู่ในส่วนวิกฤตที่มีเพียงเธรดเดียวเท่านั้นที่สามารถเข้าถึงตัวแปรได้ซึ่งในกรณีนี้ตัวแปรไม่จำเป็นต้องระเหย? ดังนั้นการใช้งาน / วัตถุประสงค์ของการระเหยในโปรแกรมมัลติเธรดคืออะไร?

8
คำว่า "ระเหย" ใช้สำหรับอะไร
Наэтотвопросестьответына Stack Overflow нарусском : Ключевоеслово volatile ใน Java ฉันอ่านบทความเกี่ยวกับvolatileคำหลัก แต่ฉันไม่สามารถเข้าใจการใช้งานที่ถูกต้อง คุณช่วยบอกฉันทีว่ามันควรใช้กับอะไรใน C # และใน Java?
130 c#  java  volatile 

4
สารระเหยมีราคาแพงหรือไม่?
หลังจากอ่านตำรา JSR-133 สำหรับนักเขียนคอมไพเลอร์เกี่ยวกับการใช้สารระเหยโดยเฉพาะส่วน "การโต้ตอบกับคำแนะนำเกี่ยวกับอะตอม" ฉันคิดว่าการอ่านตัวแปรระเหยโดยไม่ต้องอัปเดตจำเป็นต้องมี LoadLoad หรือ LoadStore barrier ถัดไปในหน้าฉันเห็นว่า LoadLoad และ LoadStore นั้นไม่มีประสิทธิภาพบนซีพียู X86 นี่หมายความว่าการดำเนินการอ่านแบบระเหยสามารถทำได้โดยไม่ต้องมีการยกเลิกแคชอย่างชัดเจนบน x86 และเร็วเท่ากับการอ่านตัวแปรปกติ (โดยไม่คำนึงถึงข้อ จำกัด ในการจัดลำดับใหม่ของการระเหย)? ฉันเชื่อว่าฉันเข้าใจสิ่งนี้ไม่ถูกต้อง มีใครสนใจที่จะสอนฉันได้ไหม แก้ไข: ฉันสงสัยว่ามีความแตกต่างในสภาพแวดล้อมแบบมัลติโปรเซสเซอร์หรือไม่ ในระบบ CPU เดียว CPU อาจมองว่าเป็นเธรดแคชของตัวเองตามที่สถานะของ John V. แต่ในระบบ CPU หลายระบบจะต้องมีตัวเลือกการกำหนดค่าบางอย่างให้กับ CPU ซึ่งไม่เพียงพอและหน่วยความจำหลักจะต้องถูกกระทบทำให้ระเหยช้าลง ในระบบ multi cpu ใช่ไหม? PS: ระหว่างทางเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ฉันสะดุดเกี่ยวกับบทความดีๆต่อไปนี้และเนื่องจากคำถามนี้อาจน่าสนใจสำหรับคนอื่นฉันจะแชร์ลิงก์ของฉันที่นี่: ทฤษฎีและการปฏิบัติ Java: การแก้ไข Java Memory Model ตอนที่ …

6
แสดงการใช้คำสำคัญที่ลบเลือนใน C #
ฉันต้องการโค้ดโปรแกรมเล็ก ๆ น้อย ๆ ที่แสดงให้เห็นถึงลักษณะการทำงานของvolatileคำหลัก ตามหลักการแล้วควรเป็นโปรแกรมที่ดำเนินการเข้าถึงพร้อมกันไปยังเขตข้อมูลคงที่ที่ไม่ลบเลือนและทำให้เกิดพฤติกรรมที่ไม่ถูกต้องด้วยเหตุนี้ การเพิ่มคีย์เวิร์ดที่ลบเลือนในโปรแกรมเดียวกันควรแก้ไขปัญหาได้ นั่นคือสิ่งที่ฉันไม่สามารถบรรลุได้ แม้จะพยายามหลายครั้งเปิดใช้งานการเพิ่มประสิทธิภาพ ฯลฯ ฉันมักจะได้พฤติกรรมที่ถูกต้องโดยไม่ต้องใช้คีย์เวิร์ด 'ระเหย' คุณมีความคิดเกี่ยวกับหัวข้อนี้หรือไม่? คุณรู้วิธีจำลองปัญหาดังกล่าวในแอปสาธิตอย่างง่ายหรือไม่? ขึ้นอยู่กับฮาร์ดแวร์หรือไม่?
88 c#  .net  volatile 

6
ผันผวนและเปลี่ยนแปลงได้ใน C ++
ฉันมีคำถามเกี่ยวกับความแตกต่างระหว่างความผันผวนและความผันแปร ฉันสังเกตว่าทั้งสองอย่างนั้นหมายความว่ามันสามารถเปลี่ยนแปลงได้ อะไรอีก? พวกเดียวกันหรือเปล่า? อะไรคือความแตกต่าง? ใช้ได้ที่ไหน? เหตุใดจึงเสนอแนวคิดทั้งสองนี้ วิธีการใช้งานที่แตกต่างกัน? ขอบคุณมาก.
86 c++  volatile  mutable 

13
คีย์เวิร์ดที่ลบเลือน C ++ แนะนำรั้วหน่วยความจำหรือไม่
ฉันเข้าใจว่าvolatileแจ้งให้คอมไพเลอร์ทราบว่าค่าอาจมีการเปลี่ยนแปลง แต่เพื่อให้ฟังก์ชันนี้สำเร็จคอมไพเลอร์จำเป็นต้องแนะนำรั้วหน่วยความจำเพื่อให้ใช้งานได้หรือไม่ จากความเข้าใจของฉันลำดับของการดำเนินการกับวัตถุระเหยไม่สามารถจัดเรียงใหม่ได้และต้องรักษาไว้ สิ่งนี้ดูเหมือนจะบ่งบอกถึงความทรงจำบางอย่างที่จำเป็นและไม่มีทางแก้ไขได้ ฉันพูดถูกต้องหรือเปล่า มีการอภิปรายที่น่าสนใจสำหรับคำถามที่เกี่ยวข้องนี้ Jonathan Wakely เขียน : ... การเข้าถึงตัวแปรระเหยที่แตกต่างกันไม่สามารถจัดลำดับใหม่โดยคอมไพเลอร์ได้ตราบเท่าที่เกิดขึ้นในนิพจน์เต็มแยกต่างหาก ... ใช่ว่าการระเหยนั้นไร้ประโยชน์สำหรับความปลอดภัยของเธรด แต่ไม่ใช่ด้วยเหตุผลที่เขาให้ ไม่ใช่เพราะคอมไพเลอร์อาจจัดลำดับการเข้าถึงวัตถุที่ระเหยได้ แต่เป็นเพราะ CPU อาจเรียงลำดับใหม่ การดำเนินการของอะตอมและอุปสรรคของหน่วยความจำป้องกันไม่ให้คอมไพเลอร์และ CPU จัดลำดับใหม่ ซึ่งDavid Schwartzตอบกลับในความคิดเห็น : ... ไม่มีความแตกต่างจากมุมมองของมาตรฐาน C ++ ระหว่างคอมไพเลอร์กำลังทำอะไรบางอย่างกับคอมไพเลอร์ส่งคำสั่งที่ทำให้ฮาร์ดแวร์ทำบางอย่าง หากซีพียูอาจจัดลำดับการเข้าถึงใหม่ไปยัง volatiles มาตรฐานก็ไม่จำเป็นต้องรักษาลำดับของมันไว้ ... ... มาตรฐาน C ++ ไม่ได้สร้างความแตกต่างเกี่ยวกับสิ่งที่จัดลำดับใหม่ และคุณไม่สามารถโต้แย้งได้ว่า CPU สามารถเรียงลำดับใหม่ได้โดยไม่มีเอฟเฟกต์ที่สังเกตเห็นได้ดังนั้นจึงไม่เป็นไร - มาตรฐาน C ++ กำหนดลำดับของมันให้สังเกตได้ คอมไพเลอร์เป็นไปตามมาตรฐาน C ++ …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.