@@ -62,7 +62,7 @@ public void testMultiThreaded() {
6262 for (int j = 0 ; j < 1000 ; ++j ) {
6363 Integer finalJ = j ;
6464 assertNull (mapping .get (k1 , k2 ));
65- mapping .computeIfAbsent (k1 , k2 , (kx ) -> finalJ );
65+ assertSame ( finalJ , mapping .computeIfAbsent (k1 , k2 , (kx ) -> finalJ ) );
6666 assertEquals (finalJ , mapping .get (k1 , k2 ));
6767 assertTrue (mapping .remove (k1 , k2 , finalJ ));
6868 if ((j & 1 ) == 0 ) {
@@ -84,4 +84,30 @@ public void testMultiThreaded() {
8484
8585 assertEquals (Set .of (), mapping .key1s ());
8686 }
87+
88+ public void testMultiThreadedSameKey () {
89+ final String k1 = randomAlphanumericOfLength (10 );
90+ KeyMapping <String , String , Integer > mapping = new KeyMapping <>();
91+
92+ List <Thread > threads = IntStream .range (0 , 10 ).mapToObj (i -> new Thread (() -> {
93+ for (int j = 0 ; j < 1000 ; ++j ) {
94+ Integer computeValue = i * 1000 + j ;
95+ Integer value = mapping .computeIfAbsent (k1 , k1 , (kx ) -> computeValue );
96+ assertNotNull (value );
97+ // either our value or another threads value.
98+ assertTrue (value == computeValue || value / 1000 != i );
99+ mapping .remove (k1 , k1 , value );
100+ }
101+ })).toList ();
102+ threads .forEach (Thread ::start );
103+ threads .forEach (t -> {
104+ try {
105+ t .join (10000 );
106+ } catch (InterruptedException e ) {
107+ throw new RuntimeException (e );
108+ }
109+ });
110+
111+ assertEquals (Set .of (), mapping .key1s ());
112+ }
87113}
0 commit comments