我在Spring Boot 2.0中使用@Cacheable与EHcache,与sync=true。
我明白,如果我们设置sync=true,所有线程都等待,直到一个线程通过执行使用@Cacheable的方法将值获取到缓存。
如果该方法中有异常会发生什么?其他线程继续等待还是锁被释放?
@Cacheable注释的思想是使用它来标记方法返回将存储在缓存中的值。
现在回到你的问题,让我们首先了解什么是同步缓存每次方法调用时,Spring将在调用后缓存其返回值以确保下次执行该方法时使用相同的参数,结果可以直接从缓存中获得需要再次执行该方法。Spring缓存返回值具有键值对的方法的。的返回结果方法。
同步缓存
在多线程环境中,某些操作可能是为同一参数并发调用(通常在启动时)。通过默认情况下,缓存抽象不锁定任何东西,同样如此值可能被计算多次,违背了缓存的目的。
对于这些特殊情况,您可以使用同步属性指导值时锁定缓存项的基础缓存提供程序正在计算。因此,只有一个线程忙于计算属性中的条目更新之前,其他条目将被阻塞缓存
sync属性的唯一目的是只有一个线程将构建缓存,其他线程将使用缓存。现在,如果在方法执行期间出现异常,这意味着获得锁的线程将永远不会在缓存中设置任何内容并退出,现在下一个线程将有机会获得锁,因为缓存中没有任何内容,如果在第二个线程执行期间发生异常,则下一个线程将获得它的机会,直到一个线程为相同的参数设置缓存。