相关疑难解决方法(0)

有效不可变对象

我想确保根据Java内存模型正确理解'有效不可变对象'的行为.

假设我们有一个可变类,我们希望将其发布为有效的不可变类:

class Outworld {
  // This MAY be accessed by multiple threads
  public static volatile MutableLong published;
}

// This class is mutable
class MutableLong {
  private long value;

  public MutableLong(long value) {
    this.value = value;
  }

  public void increment() {
    value++;
  }

  public long get() {
    return value;
  }
}
Run Code Online (Sandbox Code Playgroud)

我们执行以下操作:

// Create a mutable object and modify it
MutableLong val = new MutableLong(1);
val.increment();
val.increment();
// No more modifications
// UPDATED: Let's say for this example we …
Run Code Online (Sandbox Code Playgroud)

java concurrency immutability java-memory-model

10
推荐指数
2
解决办法
2015
查看次数

线程是否可以先通过安全发布获取对象,然后不安全地发布它?

阅读此答案后,我想到了这个问题

代码示例:

class Obj1 {
  int f1 = 0;
}

volatile Obj1 v1;
Obj1 v2;

Thread 1            | Thread 2 | Thread 3
-------------------------------------------------
var o = new Obj1(); |          |
o.f1 = 1;           |          |
v1 = o;             |          |
                    | v2 = v1; |
                    |          | var r1 = v2.f1;

Is (r1 == 0) possible?
Run Code Online (Sandbox Code Playgroud)

这里的对象o

  • 首次安全发布:从Thread 1Thread 2通过volatile字段v1
  • 然后不安全地发布:从Thread 2Thread 3 …

java multithreading java-memory-model jls safe-publication

8
推荐指数
2
解决办法
373
查看次数