相关疑难解决方法(0)

测试最终字段的初始化安全性

我试图简单地测试JLS保证的最终字段的初始化安全性.这是我写的一篇论文.但是,根据我当前的代码,我无法让它"失败".有人可以告诉我我做错了什么,或者这只是我必须反复运行然后看到一个不幸的时机失败?

这是我的代码:

public class TestClass {

    final int x;
    int y;
    static TestClass f;

    public TestClass() {
        x = 3;
        y = 4;
    }

    static void writer() {
        TestClass.f = new TestClass();
    }

    static void reader() {
        if (TestClass.f != null) {
            int i = TestClass.f.x; // guaranteed to see 3
            int j = TestClass.f.y; // could see 0

            System.out.println("i = " + i);
            System.out.println("j = " + j);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的线程正在调用它:

public class TestClient {

    public static void …
Run Code Online (Sandbox Code Playgroud)

java multithreading final thread-safety jls

30
推荐指数
3
解决办法
1722
查看次数

这是对象的安全发布吗?

我有一个课程项目

class Item {
  public int count;
  public Item(int count) {
    this.count = count;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,我将在其他类的字段中引用Item

class Holder {
  public Item item;
  public Holder() {
    item = new Item(50);
  }
}
Run Code Online (Sandbox Code Playgroud)

这个新的Item对象可以安全发布吗?如果没有,为什么?根据Java Concurrency in Practice,新的Item是在没有完全构造的情况下发布的,但在我看来,新的Item是完全构造的:它的this引用不会被转义,并且它的引用和它的状态同时发布,所以消费者线程不会看到过时的价值.或者是可见性问题.我不知道原因.

java multithreading

7
推荐指数
2
解决办法
1527
查看次数

标签 统计

java ×2

multithreading ×2

final ×1

jls ×1

thread-safety ×1