câu hỏi Có thể tương tự:Tại sao các biến trong Java dễ bay hơi theo mặc định?
Do you ever use the volatile keyword in Java?
Hôm nay tôi đã gỡ lỗi trò chơi của tôi; Nó có một vấn đề rất khó khăn mà sẽ xuất hiện sau mỗi vài phút, nhưng rất khó để tái sản xuất. Vì vậy, đầu tiên tôi thêm từ khóa
synchronized
vào mỗi phương pháp của tôi. Điều đó không hiệu quả. Sau đó, tôi đã thêm từ khóa
volatile
vào mọi trường. Vấn đề dường như chỉ sửa chữa chính nó.
Sau một số thử nghiệm, tôi thấy rằng trường chịu trách nhiệm là đối tượng GameState
theo dõi trạng thái hiện tại của trò chơi của tôi, có thể phát hoặc bận. Khi bận, trò chơi sẽ bỏ qua đầu vào của người dùng. Những gì tôi có là một chuỗi liên tục thay đổi biến số state
, trong khi chuỗi sự kiện đọc biến số state
. Tuy nhiên, sau khi một chủ đề thay đổi biến, phải mất vài giây để chuỗi khác nhận ra các thay đổi, điều này cuối cùng gây ra sự cố.
Nó đã được sửa bằng cách tạo biến trạng thái volatile
.
Tại sao các biến trong Java volatile
theo mặc định và lý do không sử dụng từ khóa volatile
là gì?
Vì cùng một phương pháp lý do không được đồng bộ hóa theo mặc định. –
@mP: Tôi không nghĩ vậy. Dễ bay hơi và đồng bộ là không tương đương: biến động không thể gây ra deadlocks. –