Improved cache performance by removing locks.
These sync locks can be removed because of fixing the multithread cases in the previous commit.
This commit is contained in:
		@@ -1,17 +1,13 @@
 | 
			
		||||
package ca.recrown.islandsurvivalcraft.caching;
 | 
			
		||||
 | 
			
		||||
import java.util.concurrent.ConcurrentHashMap;
 | 
			
		||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
 | 
			
		||||
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
 | 
			
		||||
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
 | 
			
		||||
import java.util.concurrent.locks.ReentrantLock;
 | 
			
		||||
 | 
			
		||||
public class Cache<K, V> {
 | 
			
		||||
    private final int maxSize;
 | 
			
		||||
    private final ConcurrentHashMap<K, CacheValue<K, V>> data;
 | 
			
		||||
    private final CacheUsageStack<K, V> usage = new CacheUsageStack<>();
 | 
			
		||||
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
 | 
			
		||||
    private final WriteLock writeLock = lock.writeLock();
 | 
			
		||||
    private final ReadLock readLock = lock.readLock();
 | 
			
		||||
    private final ReentrantLock lock = new ReentrantLock();
 | 
			
		||||
 | 
			
		||||
    public Cache(int maxSize) {
 | 
			
		||||
        data = new ConcurrentHashMap<>(maxSize + 1, 0.75f, 16);
 | 
			
		||||
@@ -33,7 +29,7 @@ public class Cache<K, V> {
 | 
			
		||||
        if (data.containsKey(key)) {
 | 
			
		||||
            data.get(key).value = value;
 | 
			
		||||
        } else {
 | 
			
		||||
            writeLock.lock();
 | 
			
		||||
            lock.lock();
 | 
			
		||||
            try {
 | 
			
		||||
                CacheValue<K, V> val = new CacheValue<>();
 | 
			
		||||
                val.key = key;
 | 
			
		||||
@@ -44,7 +40,7 @@ public class Cache<K, V> {
 | 
			
		||||
                    data.remove(usage.pop().key);
 | 
			
		||||
                }
 | 
			
		||||
            } finally {
 | 
			
		||||
                writeLock.unlock();
 | 
			
		||||
                lock.unlock();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -57,29 +53,22 @@ public class Cache<K, V> {
 | 
			
		||||
     * @return the value associated to the key.
 | 
			
		||||
     */
 | 
			
		||||
    public V get(K key) {
 | 
			
		||||
        CacheValue<K, V> value = null;
 | 
			
		||||
        value = data.get(key);
 | 
			
		||||
        if (value == null) return null;
 | 
			
		||||
        if (readLock.tryLock()) {
 | 
			
		||||
            try {
 | 
			
		||||
                usage.tryMoveToTop(value);
 | 
			
		||||
            } finally {
 | 
			
		||||
                readLock.unlock();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return value.value;
 | 
			
		||||
        CacheValue<K, V> cacheValue = data.get(key);
 | 
			
		||||
        if (cacheValue == null) return null;
 | 
			
		||||
        usage.tryMoveToTop(cacheValue);
 | 
			
		||||
        return cacheValue.value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Clears the cache of all values.
 | 
			
		||||
     */
 | 
			
		||||
    public void clearCache() {
 | 
			
		||||
        writeLock.lock();
 | 
			
		||||
        lock.lock();
 | 
			
		||||
        try {
 | 
			
		||||
            data.clear();
 | 
			
		||||
            usage.clear();
 | 
			
		||||
        } finally {
 | 
			
		||||
            writeLock.unlock();
 | 
			
		||||
            lock.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user