我正在努力在java中创建自动更新引用。
用例有一些不可变的对象应该是延迟初始化的,包括静态对象。这些对象将具有调用峰值,因此每次(有效地)相同的对象都会浪费一个简单的供应商调用。但是对于可能在类加载器中保存的类的较大对象而言,保持对象的位置可能需要比该值长得多。同时,用例还涉及长寿命的多线程应用程序;所以有一个简单的SoftReference或WeakReference是不够的,因为它们都不是线程安全的(我看着1.8源代码继承和直接使用引用字段和方法(没有覆盖),其中没有volatile,synchronized关键字正在使用,也没有任何明显的原子协议。)
tl:dr用例归结为该对象必须允许垃圾收集器清除该值,但是是线程安全的。在保持值(据我所知)的同时启用垃圾收集器的唯一方法是使用SoftReference或WeakReference;两者都不是线程安全的。
我试图避免使用同步的getter / setter并且使用参考类型;我们可以通过锁来确保线程安全,以阻止其他线程和强大的引用来阻止垃圾收集器。这里主要关注的是块很贵。
其他选项涉及Atomic Reference类,它被认为与Soft或Weak Reference一起使用。持有Soft / Weak Reference的最终但变异的AtomicReference或者使用同步块保存AtomicReference的易失性Soft / Weak Reference都会破坏使用AtomicReference的目的。因此,同时使用Atomic和Soft / Weak References可以让Atomic保持Soft / Weak。但是,让AtomicReference保持Soft / Weak Reference可能没有最终值的内存可见性,因为Soft / Weak不一定能确保它?
tl:dr the post 即使Reference类没有任何直接的内存可视性保险,持有Soft或Weak Reference的AtomicReference实际上是否具有内存可见性?因此,有效地提供与更昂贵的易失性和锁定组合相同的线程安全级别?