You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2018/03/03 19:05:17 UTC
groovy git commit: Improve the performance of `ConcurrentCommonCache`
further(3.0.0+ Only)
Repository: groovy
Updated Branches:
refs/heads/master 8e6dd80e1 -> 59f619b9d
Improve the performance of `ConcurrentCommonCache` further(3.0.0+ Only)
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/59f619b9
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/59f619b9
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/59f619b9
Branch: refs/heads/master
Commit: 59f619b9dd2824e487f5e82a140a2e18eb863234
Parents: 8e6dd80
Author: danielsun1106 <re...@hotmail.com>
Authored: Sun Mar 4 02:38:41 2018 +0800
Committer: danielsun1106 <re...@hotmail.com>
Committed: Sun Mar 4 02:38:41 2018 +0800
----------------------------------------------------------------------
.../runtime/memoize/ConcurrentCommonCache.java | 22 +++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/59f619b9/src/main/java/org/codehaus/groovy/runtime/memoize/ConcurrentCommonCache.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/runtime/memoize/ConcurrentCommonCache.java b/src/main/java/org/codehaus/groovy/runtime/memoize/ConcurrentCommonCache.java
index a758eb2..79b622d 100644
--- a/src/main/java/org/codehaus/groovy/runtime/memoize/ConcurrentCommonCache.java
+++ b/src/main/java/org/codehaus/groovy/runtime/memoize/ConcurrentCommonCache.java
@@ -114,19 +114,31 @@ public class ConcurrentCommonCache<K, V> implements EvictableCache<K, V>, ValueC
public V getAndPut(K key, ValueProvider<? super K, ? extends V> valueProvider, boolean shouldCache) {
V value;
- long stamp = sl.readLock();
- try {
- value = commonCache.get(key);
+ // try optimistic read first, which is non-blocking
+ long optimisticReadStamp = sl.tryOptimisticRead();
+ value = commonCache.get(key);
+ if (sl.validate(optimisticReadStamp)) {
if (null != convertValue(value)) {
return value;
}
+ }
+
+ long stamp = sl.readLock();
+ try {
+ // if stale, read again
+ if (!sl.validate(optimisticReadStamp)) {
+ value = commonCache.get(key);
+ if (null != convertValue(value)) {
+ return value;
+ }
+ }
- long ws = sl.tryConvertToWriteLock(stamp);
+ long ws = sl.tryConvertToWriteLock(stamp); // the new local variable `ws` is necessary here!
if (0L == ws) { // Failed to convert read lock to write lock
sl.unlockRead(stamp);
stamp = sl.writeLock();
- // try to find the cached value again
+ // try to read again
value = commonCache.get(key);
if (null != convertValue(value)) {
return value;