相当于什么:
AtomicReference<SomeClass> ref = new AtomicReference<SomeClass>( ... );
但没有同步成本。 请注意,我确实想将引用包装在另一个对象中。
我查看了扩展 Reference 抽象类的类,但我在所有选择中有点迷失。
我需要一些非常简单的东西,既不是弱的,也不是幻影,也不是除一个之外的所有其他参考资料。 我应该使用哪个类?
如果您想要一个没有线程安全的引用,您可以使用一个数组。
MyObject[] ref = { new MyObject() };
MyObject mo = ref[0];
ref[0] = n;
使用 java.util.concurrent.atomic.Atomic为了共享对象的引用,引用对我来说也是错误的。除了“原子性成本”之外,AtomicReference 还充满了与您的用例无关的方法,并且可能会给用户带来错误的期望。 但我在JDK中还没有遇到这样的等价类。
以下是您的选择摘要 - 选择最适合您的:
StrongReference
或MyReference
AtomicReference
Kotlin 支持
闭包,编译器只需使用捕获容器的单个公共字段。
所以一个非常直接的实现是:
public static final class Box<T> {
public T value;
}
您不应该创建 StrongReference 类(因为它很愚蠢),而是为了演示它
public class StrongReference{
Object refernece;
public void set(Object ref){
this.reference =ref;
}
public Object get(){
return this.reference;
}
}
AtomicReference.setPlain()
和
AtomicReference.getPlain()
。JavaDoc 上
setPlain
: “将值设置为 newValue,设置的内存语义就好像该变量被声明为非易失性和非最终的。”
AtomicReference
但又不想承担易失性写入的成本,您可以使用
lazySet
写入不会像普通的易失性写入那样产生内存屏障,但获取仍然会调用易失性加载(相对便宜)
AtomicReference<SomeClass> ref = new AtomicReference<SomeClass>();
ref.lazySet(someClass);
public class MyReference<T>{
T reference;
public void set(T ref){
this.reference =ref;
}
public T get(){
return this.reference;
}
}
您可以考虑添加委托 equals()、hashcode() 和 toString()。