วันพฤหัสบดี, ตุลาคม 12, 2549

Java: ว่าด้วยเรื่อง volatile และ final

== volatile ==
มาเริ่มกันที่ volatile ก่อน. เวลาที่ VM มันรัน ในแต่ละ thread มันจะมี local copy ของ variables ของ thread นั้นๆ เพื่อประสิทธิภาพในการทำงาน (หลัก locality)
ทีนี้ถ้าเรามี field ที่มี type เป็น primitive ง่ายๆ อย่างเช่น int ซึ่งมี thread 2 อัน ใช้งานฟิลด์นี้แล้วล่ะก็
ค่าที่แต่ละ thread นั้นเอาไปใช้อาจจะไม่ได้ sync กันก็ได้

volatile เป็น keyword ที่เราอาจจะคิดได้ว่าเป็นการบอก optimizer ว่าไม่ต้องทำ local copy ของ variable ตัวนี้นะ ให้ใช้จาก main memory มาทุกๆครั้ง มันก็จะไม่มีปัญหาเรื่อง data inconsistency แม้ว่าค่านี้จะถูก ใช้งานโดยหลายๆ thread ก็ตาม

ข้อแตกต่างจาก synchronized ที่เห็นชัดคือ synchronized นั้นบอกว่าให้ถือล็อคให้ได้ก่อนแล้วค่อยเข้าไปใน monitor นะ แล้วพอออกจาก monitor มันจะ sync ค่า variable ใน local copy ทั้งหมดกลับไปด้วย

ref: http://www.javaperformancetuning.com/news/qotm030.shtml

==final==

สำหรับ final สับสนกว่า เพราะมันใช้ modify ได้ตั้งแต่ variables, fields, methods, ไปยัน class เลย.
การใช้ final เพื่อเข้ามาจำกัดเมคคานิซึ่มของภาษาบางอย่างเพื่อประโยชน์ต่างๆ เช่น robustness, correctness, performance.

การใช้ final modifier ใน Java constructs แต่ละอย่างสรุปได้ดังนี้:

  1. variables: a final variable เซตค่าได้แค่ครั้งเดียวเท่านั้น.
  2. fields: a final field เซตค่าได้ครั้งเดียวเช่นกัน, อาจจะโดย constructor ของคลาสนั้น หรือโดย static block.
  3. methods: a final method ทำให้ไม่สามารถ override (nor hidden ได้ถ้า กรณีที่ไม่ใช่ private) Note that a private method also implies final.
  4. classes: a final class ห้าม extend.
ref:
http://renaud.waldura.com/doc/java/final-keyword.shtml
http://mindprod.com/jgloss/final.html

ไม่มีความคิดเห็น: