Tìm hiểu về volatile keyword

I, Mở đầu

  • Trong Java/kotlin, mọi người có thể để ý thấy từ khoá volatile.
  • Từ khoá volatile được sử dụng với property và đánh dấu chúng được lưu trữ trong main memory:
    • Read: volatile property đọc từ main memory sang 1 CPU cache.
    • Write: volatile property viết từ CPU cache sang main memory.
  • Khi volatile property thay đổi trên 1 Thread thì các Thread khác cũng sẽ biết sự thay đổi đó. Nói cách khác variable đã visible trên các Thread khác.

II, Variable visibility problem

  • Các non-volatile variable không được read and write tới main memory.

  • volatile giúp developer giải quyết được visibility problem trong multiple thread application: update propery trên 1 Thread nhưng các Thread khác không có được update đó.

  • Nghe có vẻ hơi trừu tượng, chúng ta sẽ tìm hiểu thông qua ví dụ dưới đây.

  • Ví dụ 1: chúng ta có 2 Thread có quyền truy cập vào SharedObject:

1
2
3
4
5
public class SharedObject {

public int counter = 0;

}
  • Nếu ở Thread 1, counter gán bằng 7 nhưng Thread 2, counter vẫn bằng 0.
  • Vấn đề ở đây là Thread 2 đã không nhìn thấy giá trị mới nhất của counter bởi vì nó không được write vào trong main momory. Đó cũng chính là visibility problem.
  • Ví dụ 2: tương tự như ví dụ 1 nhưng chúng ta sẽ thêm volatile keyword cho counter:
1
2
3
4
5
public class SharedObject {

public volatile int counter = 0;

}
  • Nếu ở Thread 1, counter gán bằng 7 sau đó Thread 2 đọc giá trị của counter cũng sẽ là 7.
  • Trong Java/kotlin, người ta thường sử dụng volatile keyword để implement singleton pattern.