Spring 可缓​​存未同步

Spring cacheable not synchronized

我有一个单身人士class(@Service 注释)。这个 class 有一个方法需要 200/300ms 来执行。

此方法使用@Cacheable 注释并同步。

@Cacheable(value="nextPlaying", key = "#startingFrom.getYear() + #startingFrom.getMonth() + #startingFrom.getDay() + #startingFrom.getHours() + #startingFrom.getMinutes() + #locale.getLanguage()")
public synchronized List<Match> getNextPlaying(Date startingFrom, Locale locale)

通过启动调用此方法的多个线程,我发现在结果未被缓存之前的这 200/300 毫秒内,它会一次又一次地执行该方法,直到被缓存。 似乎 @Cacheable 注释没有考虑 synchronized... 这是一个错误吗?

当您使用@Cacheable 注释时,实现缓存搜索的代码在您的方法之外。所以synchronized修饰符不影响。

如果您希望所有线程都使用缓存的结果,您应该创建一个同步方法来包装对可缓存的 getNextPlaying 方法的调用。像这样:

public synchronized List<Match> getNextPlayingSynchronized(Date startingFrom, Locale locale){
     return getNextPlaying(Date startingFrom, Locale locale);
}
...
@Cacheable(value="nextPlaying", key = "#startingFrom.getYear() + #startingFrom.getMonth() + #startingFrom.getDay() + #startingFrom.getHours() + #startingFrom.getMinutes() + #locale.getLanguage()")
public List<Match> getNextPlaying(Date startingFrom, Locale locale){
...//your old method without the synchronized modifier
}

重要的是这些方法在不同的 类 中。否则,这些方面不起作用。

好消息,spring framework 4.3 提供了一种方法来支持您的需求,方法是在@Cacheable 中添加 sync=true。