Spring boot 如何在使用sync=true的@Cacheable方法中处理异常

Spring boot 如何在使用sync=true的@Cacheable方法中处理异常,spring-boot,ehcache,Spring Boot,Ehcache,我在SpringBoot2.0中使用@Cacheable和EHcache,sync=true 我知道如果我们设置sync=true,所有线程都会等待,直到一个线程通过执行使用@Cacheable的方法获取要缓存的值 如果该方法中存在异常,会发生什么情况?其他线程是否一直在等待,或者锁是否已释放 @Cacheable注释的思想是使用它来标记 方法返回将存储在缓存中的值 每次 方法调用时,Spring将在调用后缓存其返回值 以确保下次使用相同的 参数,则可以直接从缓存中获取结果,而无需 需要再次执行

我在SpringBoot2.0中使用@Cacheable和EHcache,sync=true

我知道如果我们设置sync=true,所有线程都会等待,直到一个线程通过执行使用@Cacheable的方法获取要缓存的值

如果该方法中存在异常,会发生什么情况?其他线程是否一直在等待,或者锁是否已释放

@Cacheable注释的思想是使用它来标记 方法返回将存储在缓存中的值

每次 方法调用时,Spring将在调用后缓存其返回值 以确保下次使用相同的 参数,则可以直接从缓存中获取结果,而无需 需要再次执行该方法。Spring缓存返回值 具有键值对的方法的。该值是的返回结果 方法

现在来回答您的问题,让我们首先了解什么是同步缓存

同步缓存

在多线程环境中,某些操作可能是 为同一参数并发调用(通常在启动时)。通过 默认情况下,缓存抽象不锁定任何内容,并且相同 值可能会被计算多次,从而无法达到缓存的目的

对于这些特殊情况,您可以使用同步属性来指示 基础缓存提供程序锁定缓存项,同时 正在计算。因此,只有一个线程忙于计算 值,而其他项将被阻止,直到在 缓存

sync属性的唯一用途是,只有一个线程将构建缓存,而另一个线程将使用缓存。现在,如果在方法执行期间出现异常,这意味着获取锁的线程永远不会在缓存中设置任何内容并退出,那么下一个线程将有机会获得锁,因为缓存中不会有任何内容,如果在第二个线程执行期间发生异常,然后,下一个线程将得到它的机会,直到一个线程为相同的参数设置缓存