ใครช่วยอธิบายความหมายtransient
และโมดิvolatile
ฟายเออร์ใน Java ได้บ้าง
ใครช่วยอธิบายความหมายtransient
และโมดิvolatile
ฟายเออร์ใน Java ได้บ้าง
คำตอบ:
volatile
และโมดิtransient
ฟายเออร์สามารถใช้ได้กับฟิลด์ของคลาส1โดยไม่คำนึงถึงประเภทฟิลด์ นอกเหนือจากนั้นไม่เกี่ยวข้องกัน
โมดิtransient
ฟายเออร์จะบอกให้ระบบย่อยการทำให้เป็นอนุกรมอ็อบเจ็กต์ Java ยกเว้นฟิลด์เมื่อทำให้อนุกรมอินสแตนซ์ของคลาส เมื่อวัตถุถูก deserialized แล้วฟิลด์จะเริ่มต้นเป็นค่าเริ่มต้น เช่นnull
สำหรับประเภทการอ้างอิงและศูนย์หรือfalse
สำหรับประเภทดั้งเดิม หมายเหตุว่า JLS (ดู8.3.1.3 ) ไม่ได้พูดในสิ่งที่transient
หมายถึง แต่คล้อยตามกับวัตถุ Java เป็นอันดับจำเพาะ กลไกการทำให้เป็นอนุกรมอื่น ๆอาจให้ความสำคัญกับความtransient
-ness ของสนาม หรืออาจเพิกเฉย
(โปรดทราบว่า JLS อนุญาตให้ประกาศstatic
เขตข้อมูลเป็นtransient
ชุดค่าผสมนี้ไม่เหมาะสมสำหรับ Java Object Serialization เนื่องจากไม่ได้ทำให้เป็นอนุกรมสถิติอย่างไรก็ตามอาจสมเหตุสมผลในบริบทอื่น ๆ ดังนั้นจึงมีเหตุผลบางประการสำหรับ ไม่ห้ามทันที)
volatile
ปรับปรุงบอก JVM ที่เขียนไปยังเขตข้อมูลควรได้รับการล้างพร้อมกับหน่วยความจำและที่อ่านของสนามควรอ่านเสมอจากหน่วยความจำ ซึ่งหมายความว่าช่องที่ทำเครื่องหมายว่าระเหยสามารถเข้าถึงได้อย่างปลอดภัยและอัปเดตในแอปพลิเคชันแบบหลายเธรดโดยไม่ต้องใช้การซิงโครไนซ์ไลบรารีแบบเนทีฟหรือแบบมาตรฐาน ในทำนองเดียวกันการอ่านและเขียนไปยังเขตข้อมูลที่ระเหยได้นั้นเป็นปรมาณู (นี้ไม่ได้นำไปใช้กับ >> ไม่ระเหย << long
หรือdouble
สาขาซึ่งอาจจะมีคำว่า "ฉีก" ในบาง JVMs.) ส่วนที่เกี่ยวข้องของ JLS เป็น8.3.1.4 , 17.4และ17.7
1 - แต่ไม่ใช่ตัวแปรโลคัลหรือพารามิเตอร์
volatile
และtransient
คำหลัก
1) transient
คำหลักถูกใช้ร่วมกับตัวแปรอินสแตนซ์เพื่อแยกออกจากกระบวนการทำให้เป็นอนุกรม หากเขตข้อมูลเป็นtransient
ค่าจะไม่คงอยู่
ในทางกลับกันvolatile
คำหลักจะใช้เพื่อทำเครื่องหมายตัวแปร Java ว่า "ถูกเก็บไว้ในหน่วยความจำหลัก"
การอ่านvolatile
ตัวแปรทุกครั้งจะอ่านจากหน่วยความจำหลักของคอมพิวเตอร์ไม่ใช่จากแคชของ CPU และการเขียนทุกvolatile
ตัวแปรจะถูกเขียนไปยังหน่วยความจำหลักไม่ใช่เฉพาะในแคชของ CPU
2) transient
คำหลักไม่สามารถใช้ร่วมกับstatic
คำหลัก แต่สามารถนำมาใช้พร้อมกับvolatile
static
3) transient
ตัวแปรจะเริ่มต้นด้วยค่าเริ่มต้นในระหว่างการลดอนุกรมและการกำหนดหรือการคืนค่าจะต้องได้รับการจัดการโดยรหัสแอปพลิเคชัน
สำหรับข้อมูลเพิ่มเติมโปรดดูบล็อกของฉัน:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html
transient
ไม่สามารถใช้ตัวแปรร่วมกับstatic
คีย์เวิร์ดได้คือตัวแปรคงที่เป็นของคลาสไม่ใช่ของแต่ละอินสแตนซ์ แนวคิดของการทำให้เป็นอนุกรมเกี่ยวข้องกับสถานะปัจจุบันของวัตถุ เฉพาะข้อมูลที่เชื่อมโยงกับอินสแตนซ์เฉพาะของคลาสเท่านั้นที่ถูกทำให้เป็นอนุกรมดังนั้นฟิลด์สมาชิกแบบคงที่จะถูกละเว้นระหว่างการทำให้เป็นอนุกรม
static
และtransient
ให้ใช้ร่วมกันได้ ปัญหาคือมันสมเหตุสมผลน้อยเพราะกลไกการทำให้เป็นอนุกรมโดยทั่วไปไม่คงสถิตอยู่แล้ว
Volatile หมายถึงเธรดอื่น ๆ สามารถแก้ไขตัวแปรนั้นได้ ดังนั้นคอมไพเลอร์จึงอนุญาตให้เข้าถึงได้
http://www.javamex.com/tutorials/synchronization_volatile.shtml
ชั่วคราวหมายความว่าเมื่อคุณทำให้เป็นอนุกรมวัตถุวัตถุนั้นจะส่งคืนค่าเริ่มต้นในการยกเลิกการทำให้เป็นอนุกรม
ชั่วคราว:
ก่อนอื่นต้องรู้ว่าจำเป็นต้องเชื่อมช่องว่างอย่างไร
1) ตัวปรับเปลี่ยนการเข้าถึงชั่วคราวใช้ได้กับส่วนประกอบตัวแปรเท่านั้น จะไม่ใช้กับ method หรือ class
2) ไม่สามารถใช้คีย์เวิร์ดชั่วคราวร่วมกับคีย์เวิร์ดแบบคงที่ได้
3) การทำให้เป็นอนุกรมคืออะไรและใช้ที่ไหน? การทำให้เป็นอนุกรมเป็นกระบวนการทำให้สถานะของวัตถุคงอยู่ นั่นหมายถึงสถานะของอ็อบเจ็กต์ถูกแปลงเป็นสตรีมไบต์เพื่อใช้ในการคงอยู่ (เช่นการจัดเก็บไบต์ในไฟล์) หรือการถ่ายโอน (เช่นการส่งไบต์ข้ามเครือข่าย) ในทำนองเดียวกันเราสามารถใช้ deserialization เพื่อดึงสถานะของวัตถุกลับมาจากไบต์ นี่เป็นแนวคิดที่สำคัญอย่างหนึ่งในการเขียนโปรแกรม Java เนื่องจากการทำให้เป็นอนุกรมส่วนใหญ่ใช้ในการเขียนโปรแกรมระบบเครือข่าย อ็อบเจ็กต์ที่ต้องการส่งผ่านเครือข่ายจะต้องถูกแปลงเป็นไบต์ ก่อนที่จะเข้าใจคำหลักชั่วคราวเราต้องเข้าใจแนวคิดของการทำให้เป็นอนุกรม หากผู้อ่านทราบเกี่ยวกับการทำให้เป็นอนุกรมโปรดข้ามจุดแรกไป
หมายเหตุ 1) Transient ส่วนใหญ่ใช้สำหรับกระบวนการ serialzation สำหรับคลาสนั้นจะต้องใช้อินเทอร์เฟซ java.io.Serializable ฟิลด์ทั้งหมดในคลาสต้องต่ออนุกรมกันได้ หากฟิลด์ไม่สามารถทำให้เป็นอนุกรมได้จะต้องทำเครื่องหมายชั่วคราว
หมายเหตุ 2) เมื่อกระบวนการ deserialized เกิดขึ้นพวกเขาจะได้รับการตั้งค่าเป็นค่าเริ่มต้น - ศูนย์เท็จหรือว่างตามข้อ จำกัด ประเภท
หมายเหตุ 3) คำสำคัญชั่วคราวและวัตถุประสงค์? ฟิลด์ที่ประกาศด้วยโมดิฟายเออร์ชั่วคราวจะไม่มีส่วนร่วมในกระบวนการต่อเนื่อง เมื่ออ็อบเจ็กต์ถูกทำให้เป็นอนุกรม (บันทึกในสถานะใด ๆ ) ค่าของฟิลด์ชั่วคราวของมันจะถูกละเว้นในการแสดงอนุกรมในขณะที่ฟิลด์อื่นที่ไม่ใช่ฟิลด์ชั่วคราวจะมีส่วนในกระบวนการทำให้เป็นอนุกรม นั่นคือจุดประสงค์หลักของคีย์เวิร์ดชั่วคราว