Snailclimb / Snailclimb/JavaGuide
关于Java 并发常见面试题总结(中)“如何保证变量的可见性?”问题的答案详解
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- JavaScript
- Star
- 159k
- Fork
- 46.1k
- Merge trung bình
- 14 giờ 36 phút
- Pull request đã merge (30 ngày)
- 6
Mô tả
Guide哥你好,问题见下图,参考众多权威文献以及文章我认为,Java volatile关键字保证可见性是基于总线嗅探+缓存一致性协议(MESI协议),所以我认为并不是每次使用都会到主存中获取。
而MESI协议具体,我们可以从四个字母分别代表4种状态来理解:
- Modify(修改):当缓存行中的数据被修改时,该缓存行置为M状态
- Exclusive(独占):当只有一个缓存行使用某个数据时,置为E状态
- Shared(共享):当其他CPU中也读取某数据到缓存行时,所有持有该数据的缓存行置为S状态
- Invalid(无效):当某个缓存行数据修改时,其他持有该数据的缓存行置为I状态

以下图为例,我认为Java volatile变量保证可见性的原因,可以从这样一个场景理解(假设线程1在CPU1上,线程2在CPU上)
CPU1读取数据a=1,CPU1的缓存中都有数据a的副本,该缓存行置为(E)独占状态
CPU2也执行读取操作,同样CPU2也有数据a=1的副本,此时总线嗅探到CPU1也有该数据,则CPU1、CPU2两个缓存行都置为(S)共享状态
CPU1修改数据a=2,CPU1的缓存以及主内存a=2,同时CPU1的缓存行置为(S)状态,总线发出通知,CPU2收到通知将缓存行置为(I)无效状态
CPU2再次读取a,虽然CPU2在缓存中命中数据a=1,但是发现状态为(I),因此直接丢弃该数据,去主内存获取最新数据

所以我认为应该改为(答案已提交PR,劳烦Guide哥看看是否得当):
在 Java 中,volatile 关键字底层是基于总线嗅探机制和MESI缓存一致性协议保证变量的可见性,如果我们将变量声明为 volatile ,这就指示CPU,这个变量是共享且不稳定的,每次使用它时,处理器都会判断这个变量在缓存行中的状态是否因为其他处理器的修改变成无效(Invalid),若无效则重新从系统内存中把数据读取到处理器缓存。
参考文章:
- https://zhuanlan.zhihu.com/p/250657181
- Java书籍《Java并发编程的艺术》

Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với câu trả lời phỏng vấn về tính đồng thời trong Java có tiêu đề “如何保证变量的可见性?” và xem lại phần giải thích được đề xuất cùng các nguồn được trích dẫn trong issue này. Xác minh cách diễn đạt về volatile, tính nhất quán của bộ nhớ đệm và bộ nhớ chính, rồi coi công việc là hoàn tất khi câu trả lời đã được sửa và PR đã gửi hoặc quyết định của maintainer đã được giải quyết.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- java
- Lĩnh vực
- documentation
- Loại issue
- Tài liệu
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 35/100