If the result of the first execution was not cached, the second call will continue.
You should understand that @Cacheable centered around the contents of the cache (and not specifically the context of the thread's execution [well, like, the cache should still be thread safe]). When the method is executed, the cache is first checked to see if the key exists: if t1 takes some time, its result will not be cached, so simultaneous actions will be performed without taking into account t1
source share