Skip to content

Commit 90188d5

Browse files
authored
Merge pull request #1243 from brendandburns/striped
Switch to a striped lock for better concurrency.
2 parents bb523c0 + 6cbcfa7 commit 90188d5

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

util/src/main/java/io/kubernetes/client/util/ModelMapper.java

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import com.google.common.base.Strings;
1616
import com.google.common.reflect.ClassPath;
17+
import com.google.common.util.concurrent.Striped;
1718
import io.kubernetes.client.Discovery;
1819
import io.kubernetes.client.apimachinery.GroupVersionKind;
1920
import io.kubernetes.client.apimachinery.GroupVersionResource;
@@ -29,6 +30,7 @@
2930
import java.util.Map;
3031
import java.util.Set;
3132
import java.util.concurrent.ConcurrentHashMap;
33+
import java.util.concurrent.locks.ReadWriteLock;
3234
import org.apache.commons.lang3.tuple.MutablePair;
3335
import org.apache.commons.lang3.tuple.Pair;
3436
import org.slf4j.Logger;
@@ -366,18 +368,41 @@ private static Pair<String, String> getApiVersion(String name) {
366368
static class BiDirectionalMap<K, V> {
367369
private Map<K, V> kvMap = new HashMap<>();
368370
private Map<V, K> vkMap = new HashMap<>();
369-
370-
synchronized void add(K k, V v) {
371-
kvMap.put(k, v);
372-
vkMap.put(v, k);
371+
private Striped<ReadWriteLock> lock =
372+
Striped.readWriteLock(Runtime.getRuntime().availableProcessors() * 4);
373+
374+
void add(K k, V v) {
375+
ReadWriteLock keyLock = lock.get(k);
376+
ReadWriteLock valueLock = lock.get(v);
377+
keyLock.writeLock().lock();
378+
valueLock.writeLock().lock();
379+
try {
380+
kvMap.put(k, v);
381+
vkMap.put(v, k);
382+
} finally {
383+
keyLock.writeLock().unlock();
384+
valueLock.writeLock().unlock();
385+
}
373386
}
374387

375-
synchronized V getByK(K k) {
376-
return kvMap.get(k);
388+
V getByK(K k) {
389+
ReadWriteLock l = lock.get(k);
390+
l.readLock().lock();
391+
try {
392+
return kvMap.get(k);
393+
} finally {
394+
l.readLock().unlock();
395+
}
377396
}
378397

379-
synchronized K getByV(V v) {
380-
return vkMap.get(v);
398+
K getByV(V v) {
399+
ReadWriteLock l = lock.get(v);
400+
l.readLock().lock();
401+
try {
402+
return vkMap.get(v);
403+
} finally {
404+
l.readLock().unlock();
405+
}
381406
}
382407
}
383408
}

0 commit comments

Comments
 (0)