File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,28 @@
1717

1818
import static com..benmanes.caffeine.cache.LocalCacheSubject.mapLocal;
1919
import static com..benmanes.caffeine.cache.testing.CacheSubject.assertThat;
20+
import static com..benmanes.caffeine.testing.Awaits.await;
2021
import static com..benmanes.caffeine.testing.MapSubject.assertThat;
2122
import static com.google.common.truth.Truth.assertAbout;
2223
import static com.google.common.truth.Truth.assertThat;
24+
import static java.lang.Thread.State.BLOCKED;
25+
import static java.lang.Thread.State.WAITING;
2326
import static org.junit.jupiter.api.Assertions.assertThrows;
2427

2528
import java.lang.ref.WeakReference;
2629
import java.util.Arrays;
2730
import java.util.Collections;
31+
import java.util.EnumSet;
2832
import java.util.Set;
33+
import java.util.concurrent.atomic.AtomicBoolean;
34+
import java.util.concurrent.atomic.AtomicReference;
2935

3036
import org.testng.Assert;
3137
import org.testng.annotations.DataProvider;
3238
import org.testng.annotations.Test;
3339

3440
import com..benmanes.caffeine.cache.References.WeakKeyEqualsReference;
41+
import com..benmanes.caffeine.testing.ConcurrentTestHarness;
3542
import com..benmanes.caffeine.testing.Int;
3643
import com.google.common.collect.testing.SetTestSuiteBuilder;
3744
import com.google.common.collect.testing.TestStringSetGenerator;
@@ -138,6 +145,36 @@ public void intern_weak_cleanup() {
138145
assertThat(interner.cache.drainStatus).isEqualTo(BoundedLocalCache.IDLE);
139146
}
140147

148+
@Test
149+
public void intern_weak_retry() {
150+
var canonical = new Int(1);
151+
var other = new Int(1);
152+
153+
var done = new AtomicBoolean();
154+
var started = new AtomicBoolean();
155+
var writer = new AtomicReference<Thread>();
156+
var interner = (WeakInterner<Int>) Interner.<Int>newWeakInterner();
157+
158+
var result = interner.cache.compute(canonical, (k, v) -> {
159+
ConcurrentTestHarness.execute(() -> {
160+
writer.set(Thread.currentThread());
161+
started.set(true);
162+
var value = interner.intern(other);
163+
assertThat(value).isSameInstanceAs(canonical);
164+
done.set(true);
165+
});
166+
await().untilTrue(started);
167+
var threadState = EnumSet.of(BLOCKED, WAITING);
168+
await().until(() -> {
169+
var thread = writer.get();
170+
return (thread != null) && threadState.contains(thread.getState());
171+
});
172+
return true;
173+
});
174+
assertThat(result).isTrue();
175+
assertThat(interner.intern(canonical)).isSameInstanceAs(canonical);
176+
}
177+
141178
@Test
142179
public void nullPointerExceptions() {
143180
new NullPointerTester().testAllPublicStaticMethods(Interner.class);

0 commit comments

Comments
 (0)