You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2014/03/07 09:29:48 UTC

git commit: WICKET-5527 Inefficient DefaultPageStore.SerializedPagesCache

Repository: wicket
Updated Branches:
  refs/heads/5527-inefficient-DefaultDataStore [created] 8908b8f23


WICKET-5527 Inefficient DefaultPageStore.SerializedPagesCache

Replace the ArrayList with ConcurrentLinkedDeque.
Remove the synchronization on it


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/8908b8f2
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/8908b8f2
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/8908b8f2

Branch: refs/heads/5527-inefficient-DefaultDataStore
Commit: 8908b8f23d6a3e62eed021cac669d65cf9d0bf66
Parents: d269534
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Mar 6 16:26:52 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Mar 6 16:26:52 2014 +0200

----------------------------------------------------------------------
 .../wicket/pageStore/DefaultPageStore.java      | 93 ++++++++------------
 1 file changed, 39 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/8908b8f2/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageStore.java
index 1e44ef0..96d4ff0 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageStore.java
@@ -18,9 +18,8 @@ package org.apache.wicket.pageStore;
 
 import java.io.Serializable;
 import java.lang.ref.SoftReference;
-import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.List;
+import java.util.concurrent.ConcurrentLinkedDeque;
 
 import org.apache.wicket.page.IManageablePage;
 import org.apache.wicket.serialize.ISerializer;
@@ -411,7 +410,7 @@ public class DefaultPageStore implements IPageStore
 	{
 		private final int size;
 
-		private final List<SoftReference<SerializedPage>> cache;
+		private final ConcurrentLinkedDeque<SoftReference<SerializedPage>> cache;
 
 		/**
 		 * Construct.
@@ -421,7 +420,7 @@ public class DefaultPageStore implements IPageStore
 		public SerializedPagesCache(final int size)
 		{
 			this.size = size;
-			cache = new ArrayList<>(size);
+			cache = new ConcurrentLinkedDeque<>();
 		}
 
 		/**
@@ -436,18 +435,15 @@ public class DefaultPageStore implements IPageStore
 
 			if (size > 0)
 			{
-				synchronized (cache)
+				for (Iterator<SoftReference<SerializedPage>> i = cache.iterator(); i.hasNext();)
 				{
-					for (Iterator<SoftReference<SerializedPage>> i = cache.iterator(); i.hasNext();)
+					SoftReference<SerializedPage> ref = i.next();
+					SerializedPage entry = ref.get();
+					if (entry != null && entry.getPageId() == id &&
+						entry.getSessionId().equals(sessionId))
 					{
-						SoftReference<SerializedPage> ref = i.next();
-						SerializedPage entry = ref.get();
-						if (entry != null && entry.getPageId() == id &&
-							entry.getSessionId().equals(sessionId))
-						{
-							i.remove();
-							return entry;
-						}
+						i.remove();
+						return entry;
 					}
 				}
 			}
@@ -466,16 +462,13 @@ public class DefaultPageStore implements IPageStore
 
 			if (size > 0)
 			{
-				synchronized (cache)
+				for (Iterator<SoftReference<SerializedPage>> i = cache.iterator(); i.hasNext();)
 				{
-					for (Iterator<SoftReference<SerializedPage>> i = cache.iterator(); i.hasNext();)
+					SoftReference<SerializedPage> ref = i.next();
+					SerializedPage entry = ref.get();
+					if (entry != null && entry.getSessionId().equals(sessionId))
 					{
-						SoftReference<SerializedPage> ref = i.next();
-						SerializedPage entry = ref.get();
-						if (entry != null && entry.getSessionId().equals(sessionId))
-						{
-							i.remove();
-						}
+						i.remove();
 					}
 				}
 			}
@@ -497,26 +490,23 @@ public class DefaultPageStore implements IPageStore
 			SerializedPage result = null;
 			if (size > 0)
 			{
-				synchronized (cache)
+				for (Iterator<SoftReference<SerializedPage>> i = cache.iterator(); i.hasNext();)
 				{
-					for (Iterator<SoftReference<SerializedPage>> i = cache.iterator(); i.hasNext();)
+					SoftReference<SerializedPage> ref = i.next();
+					SerializedPage entry = ref.get();
+					if (entry != null && entry.getPageId() == pageId &&
+						entry.getSessionId().equals(sessionId))
 					{
-						SoftReference<SerializedPage> ref = i.next();
-						SerializedPage entry = ref.get();
-						if (entry != null && entry.getPageId() == pageId &&
-							entry.getSessionId().equals(sessionId))
-						{
-							i.remove();
-							result = entry;
-							break;
-						}
+						i.remove();
+						result = entry;
+						break;
 					}
+				}
 
-					if (result != null)
-					{
-						// move to top
-						storePage(result);
-					}
+				if (result != null)
+				{
+					// move to top
+					storePage(result);
 				}
 			}
 			return result;
@@ -530,28 +520,23 @@ public class DefaultPageStore implements IPageStore
 		 */
 		void storePage(SerializedPage page)
 		{
-			SoftReference<SerializedPage> ref = new SoftReference<SerializedPage>(page);
-
 			if (size > 0)
 			{
-				synchronized (cache)
+				for (Iterator<SoftReference<SerializedPage>> i = cache.iterator(); i.hasNext();)
 				{
-					for (Iterator<SoftReference<SerializedPage>> i = cache.iterator(); i.hasNext();)
+					SoftReference<SerializedPage> r = i.next();
+					SerializedPage entry = r.get();
+					if (entry != null && entry.equals(page))
 					{
-						SoftReference<SerializedPage> r = i.next();
-						SerializedPage entry = r.get();
-						if (entry != null && entry.equals(page))
-						{
-							i.remove();
-							break;
-						}
+						i.remove();
+						break;
 					}
+				}
 
-					cache.add(ref);
-					if (cache.size() > size)
-					{
-						cache.remove(0);
-					}
+				cache.add(new SoftReference<>(page));
+				if (cache.size() > size)
+				{
+					cache.remove(0);
 				}
 			}
 		}