Java WeakReference的罕见用法?

Java WeakReference的罕见用法?,java,weak-references,soft-references,Java,Weak References,Soft References,我有一个类,它的实例被初始化并由底层的flatform使用 类MyAttributeConverter实现AttributeConverter{ 公共YY convertToDatabaseColumn(XX属性){return null;} public XX convertToEntityAttribute(YY dbData){return null;} } 没什么问题,我想我需要添加一些静态方法作为方法引用 私有静态MyAttributeConverter实例; //只是一个懒惰的初始

我有一个类,它的实例被初始化并由底层的flatform使用

类MyAttributeConverter实现AttributeConverter{ 公共YY convertToDatabaseColumn(XX属性){return null;} public XX convertToEntityAttribute(YY dbData){return null;} } 没什么问题,我想我需要添加一些静态方法作为方法引用

私有静态MyAttributeConverter实例;
//只是一个懒惰的初始化;
//不需要同步;
//多实例化不是问题;
私有静态MyAttributeConverter实例(){
if(实例==null){
实例=新的MyAttributeConverter();
}
返回实例;
}
//按MyAttributeConverter::toDatabaseColumn(xx)执行
公共静态YY toDatabaseColumn(XX属性){
返回实例().convertToDatabaseColumn(属性);
}
公共静态XX toEntityAttribute(YY dbData){
返回实例().convertToEntityAttribute(属性);
}
仍然没有什么问题(我相信),我不喜欢类中的
实例
,这就是为什么我要这么做

私有静态WeakReference引用;

公共静态R applyInstance(函数注意

//多实例化不是问题;
私有静态MyAttributeConverter实例(){
if(实例==null){
实例=新的MyAttributeConverter();
}
返回实例;
}
不是线程安全的,因为它对
实例
字段进行了两次读取;它们中的每一个都可能感知到由其他线程进行的更新或不进行的更新。这意味着在
实例==null
中读取的第一个可能感知到由另一个线程写入的新值,而在
返回实例;
中读取的第二个可能会计算到上一个value,即
null
。因此,当多个线程同时执行此方法时,此方法可能返回
null
。这是一种罕见的情况,但此方法并不安全。您需要一个局部变量来确保test和return语句使用相同的值

//多实例化不是问题;
私有静态MyAttributeConverter实例(){
MyAttributeConverter当前=实例;
如果(当前==null){
实例=当前=新的MyAttributeConverter();
}
回流;
}
只有当
MyAttributeConverter
仅使用
final
字段不可变时,这仍然是安全的。否则,一个线程可能返回由另一个线程创建的处于未完全构造状态的实例

您可以使用简单的方法使其安全,而无需这些约束:

private静态最终MyAttributeConverter实例=新的MyAttributeConverter();
私有静态MyAttributeConverter实例(){
返回实例;
}
这仍然是延迟的,因为类初始化只发生在上,即方法
instance()
的第一次调用


使用
WeakReference
也会遇到同样的问题。此外,还不清楚为什么在局部变量中已有所需参数的两个点上对方法进行递归调用

正确的实现可能要简单得多:

私有静态WeakReference引用;
公共静态R应用程序状态(

函数注意如下方法

//多实例化不是问题;
私有静态MyAttributeConverter实例(){
if(实例==null){
实例=新的MyAttributeConverter();
}
返回实例;
}
不是线程安全的,因为它对
实例
字段进行了两次读取;它们中的每一个都可能感知到由其他线程进行的更新或不进行的更新。这意味着在
实例==null
中读取的第一个可能感知到由另一个线程写入的新值,而在
返回实例;
中读取的第二个可能会计算到上一个value,即
null
。因此,当多个线程同时执行此方法时,此方法可能返回
null
。这是一种罕见的情况,但此方法并不安全。您需要一个局部变量来确保test和return语句使用相同的值

//多实例化不是问题;
私有静态MyAttributeConverter实例(){
MyAttributeConverter当前=实例;
如果(当前==null){
实例=当前=新的MyAttributeConverter();
}
回流;
}
只有当
MyAttributeConverter
仅使用
final
字段不可变时,这仍然是安全的。否则,一个线程可能返回由另一个线程创建的处于未完全构造状态的实例

您可以使用简单的方法使其安全,而无需这些约束:

private静态最终MyAttributeConverter实例=新的MyAttributeConverter();
私有静态MyAttributeConverter实例(){
返回实例;
}
这仍然是延迟的,因为类初始化只发生在上,即方法
instance()
的第一次调用


使用
WeakReference
也会遇到同样的问题。此外,还不清楚为什么在局部变量中已有所需参数的两个点上对方法进行递归调用

正确的实现可能要简单得多:

私有静态WeakReference引用;
公共静态R应用程序状态(

函数这里有几种代码味道,特别是静态的使用和“需要”方法引用的概念。这似乎是一个JPA转换器,在这种情况下几乎没有任何意义;这些只是普通的(实例)实现接口的对象。我不明白您在问什么,但您正在
Wea中包装一个静态字段