java - 最终字段语义
问题描述
17.5。final 字段语义
例 17.5-1。Java 内存模型中的 final 字段
class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
if (f != null) {
int i = f.x; // guaranteed to see 3
int j = f.y; // could see 0
}
}
}
我被这个问题困扰了好几天。
谁能直接回答我为什么 fy 可以看到 0?
解决方案
如果线程 A 分配y
:
Thread A:
writer();
和线程 B 读取y
:
Thread B
reader();
然后y
在没有任何同步的情况下被读取,因此可能看不到分配的值。它是 Java 同步要求的一个简单应用。如果您仍然不明白,请在您的问题中澄清。
换句话说,如果y
被声明为volatile
then 就可以保证被看到。
class FinalFieldExample {
final int x;
volatile int y;
然后:
static void reader() {
if (f != null) {
int i = f.x; // guaranteed to see 3
int j = f.y; // guaranteed to see 4
推荐阅读
- java - 如何使用 Lombok 访问 getter 和 setter 方法?
- c++ - 使用继承的 QGraphicsScene 时的 SIGSEGV
- c# - 针对登录用户,为多个数据库架构动态创建 DbContext
- selenium - Selenium 测试用例是宏吗?
- wpf - 页面只能有 Frame 作为父级,不能有 Window
- javascript - Formdata 对象正在转换为 ASP.NET MVC 中的查询字符串
- java - 如何将对象类列表添加到arraylist?
- javascript - 使用带有 ASP.NET Core 的自定义 html 属性对数据表中的列进行排序
- python - 在python中运行多线程被暂停
- python - 我应该什么时候调用 PyGILState_Ensure?