คีย์เวิร์ด volatile ใช้ในสภาพแวดล้อมมัลติเธรด (multithreading) ที่สองเธรดอ่านและเขียนตัวแปรเดียวกันพร้อมกัน คีย์เวิร์ด volatile จะส่งการเปลี่ยนแปลงไปยังหน่วยความจำหลัก (main memory) โดยตรง แทนที่จะเป็น CPU cache
ส่วคีย์เวิร์ด transient ใช้ในการทำ Serialization ฟิลด์ที่ถูกทำเครื่องหมายว่า transient จะไม่เป็นส่วนหนึ่งของ serialization และ deserialization หากเราไม่ต้องการบันทึกค่าของตัวแปรใด ให้ใช้คีย์เวิร์ด transient กับตัวแปรนั้น
| ลำดับ | หัวข้อ | Volatile | Transient |
|---|---|---|---|
| 1 | พื้นฐาน | Volatile ใช้ส่งการเปลี่ยนแปลงไปหน่วยความจำหลักโดยตรง | Transient ใช้เพื่อยกเว้นตัวแปรระหว่าง serialization |
| 2 | ค่าเริ่มต้น | Volatile ไม่ได้ถูกเริ่มต้นด้วยค่าเริ่มต้น | ระหว่าง deserialization ตัวแปร transient จะถูกเริ่มต้นด้วยค่าเริ่มต้น |
| 3 | Static | Volatile ใช้กับตัวแปร static ได้ | Transient ไม่สามารถใช้กับคีย์เวิร์ด static ได้ |
| 4 | Final | Volatile ใช้กับคีย์เวิร์ด final ได้ | Transient ไม่สามารถใช้กับคีย์เวิร์ด final ได้ |
ตัวอย่าง Transient
// คลาสตัวอย่างที่ใช้ transient เพื่อข้ามการ serialize
class TransientExample implements Serializable {
transient int age;
// serialize ฟิลด์อื่นๆ
private String name;
private String address;
// โค้ดอื่นๆ
}ตัวอย่าง Volatile
class VolatileExample extends Thread{
boolean volatile isRunning = true;
public void run() {
long count = 0;
while (isRunning) {
count++;
}
System.out.println("Thread terminated. " + count);
}
public static void main(String[] args) throws InterruptedException {
VolatileExample t = new VolatileExample();
t.start();
Thread.sleep(2000);
t.isRunning = false;
t.join();
System.out.println("isRunning set to " + t.isRunning);
}
}