Java 用番石榴和;春天

Java 用番石榴和;春天,java,multithreading,spring,guava,Java,Multithreading,Spring,Guava,强调在初始化时通过Multimaps.synchronizedMultimap包装multimap的重要性,以实现线程安全访问。鉴于此,我知道我可以创建以下多重映射: private Multimap<Short, String> successfulMultimap = Multimaps.synchronizedMultimap(HashMultimap.<Short, String>create()); private Multimap successfullm

强调在初始化时通过
Multimaps.synchronizedMultimap
包装multimap的重要性,以实现线程安全访问。鉴于此,我知道我可以创建以下多重映射:

private Multimap<Short, String> successfulMultimap = 
Multimaps.synchronizedMultimap(HashMultimap.<Short, String>create());
private Multimap successfullmultimap=
synchronizedMultimap(HashMultimap.create());
然而,我的multimap需要使用Spring注入,因为它将被我服务上的另一个类使用

如果没有同步包装器,我知道我可以使用以下内容:

//setter
public void setSuccessfulMultimap(Multimap<Short, String> successfulMultimap) {
    this.successfulMultimap = successfulMultimap;
}

<!-- XML configuration -->
<bean id="myBean" factory-method="create" class="com.google.common.collect.HashMultimap"/>
//setter
public void setSuccessfulMultimap(Multimap successfulMultimap){
this.successfullmultimap=successfullmultimap;
}

但是,由于我需要将它初始化为线程安全的,所以我对如何“spring”-将它初始化迷茫了。有人能帮我介绍一下如何注入同步多重映射或任何好的方法吗

您应该能够在spring set方法中放入适当的代码:

//setter
public void setSuccessfulMultimap(Multimap<Short, String> value) {
    successfulMultimap = Multimap.synchronizedMultimap(value);
}
//setter
public void setSuccessfulMultimap(Multimap值){
successfulMultimap=Multimap.synchronizedMultimap(值);
}

由于它是在对象构造之后设置的,因此您可能还希望使
successfullmultimap
成员
volatile
,以确保初始化对其他线程可见。

谢谢,@Warren!正是我想要的。:)虽然我使用setter类型来实现
HashMultimap
而不是multimap接口。另外,既然您提到了“volatile”,我是否仍然必须使用java的
synchronized
块访问我的multimap,或者
volatile
就足够了?您需要同步对multimap的访问,或者将其包装在multimap中。synchronizedMultimap()如我的示例中所示,因此在构造multimap之后访问multimap是线程安全的。任何一个都足够了。volatile关键字仅确保多重映射在初始化后对其他线程可见,而不是在其他线程读取空值时仍在缓存中。再次感谢,@WarrenDew!:)