Khai báo một biến static trong Java, có nghĩa là sẽ chỉ có một bản sao, bất kể có bao nhiêu đối tượng của lớp được tạo. Biến sẽ có thể truy cập được ngay cả khi không có đối tượng nào được tạo ra. Tuy nhiên, các thread có thể có các giá trị được lưu trong bộ nhớ cache cục bộ của nó.
Khi một biến là volatile và non-static, sẽ có một biến cho mỗi đối tượng. Vì vậy, bề ngoài có vẻ như không có sự khác biệt so với một biến bình thường nhưng hoàn toàn khác với static. Tuy nhiên, ngay cả với các thuộc tính của đối tượng, một thread có thể lưu vào bộ nhớ cache một giá trị biến cục bộ.
Điều này có nghĩa là nếu hai thread cập nhật đồng thời một biến của cùng một đối tượng và biến đó không được khai báo là biến volatile, có thể xảy ra trường hợp một trong các thread có giá trị cũ trong bộ nhớ cache.
Ngay cả khi bạn truy cập một giá trị static thông qua nhiều thread, mỗi thread có thể có bản sao được lưu trong bộ nhớ cache cục bộ của nó! Để tránh điều này, bạn có thể khai báo biến là static volatile và điều này sẽ buộc thread đọc giá trị toàn cục mỗi lần.