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ữ trongmain 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 | public class SharedObject { |
- 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 chocounter
:
1 | public class SharedObject { |
- Nếu ở Thread 1,
counter
gán bằng 7 sau đó Thread 2 đọc giá trị củacounter
cũng sẽ là 7. - Trong Java/kotlin, người ta thường sử dụng
volatile
keyword để implement singleton pattern.