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/06 09:33:33 UTC

[16/19] git commit: Use AtomicInteger instead of a volatile int.

Use AtomicInteger instead of a volatile int.

++ operation is not atomic and it may fail with 'int'


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

Branch: refs/heads/master
Commit: 90fa7ed0f228a66d8867dd741fb56e743cd55f61
Parents: d6e1da8
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Mar 6 10:15:20 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Mar 6 10:15:20 2014 +0200

----------------------------------------------------------------------
 .../wicket/util/collections/IntHashMap.java     | 23 ++++++++++----------
 1 file changed, 12 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/90fa7ed0/wicket-util/src/main/java/org/apache/wicket/util/collections/IntHashMap.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/collections/IntHashMap.java b/wicket-util/src/main/java/org/apache/wicket/util/collections/IntHashMap.java
index 139c814..7b377fc 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/collections/IntHashMap.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/collections/IntHashMap.java
@@ -26,6 +26,7 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * This is an integer hashmap that has the exact same features and interface as a normal Map except
@@ -88,7 +89,7 @@ public class IntHashMap<V> implements Cloneable, Serializable
 	 * structure (e.g., rehash). This field is used to make iterators on Collection-views of the
 	 * HashMap fail-fast. (See ConcurrentModificationException).
 	 */
-	transient volatile int modCount;
+	transient AtomicInteger modCount = new AtomicInteger(0);
 
 	/**
 	 * Constructs an empty <tt>HashMap</tt> with the specified initial capacity and load factor.
@@ -299,7 +300,7 @@ public class IntHashMap<V> implements Cloneable, Serializable
 			}
 		}
 
-		modCount++;
+		modCount.incrementAndGet();
 		addEntry(key, value, i);
 		return null;
 	}
@@ -478,7 +479,7 @@ public class IntHashMap<V> implements Cloneable, Serializable
 			Entry<V> next = e.next;
 			if (key == e.key)
 			{
-				modCount++;
+				modCount.incrementAndGet();
 				size--;
 				if (prev == e)
 				{
@@ -522,7 +523,7 @@ public class IntHashMap<V> implements Cloneable, Serializable
 			Entry<V> next = e.next;
 			if ((e.key == key) && e.equals(entry))
 			{
-				modCount++;
+				modCount.incrementAndGet();
 				size--;
 				if (prev == e)
 				{
@@ -546,7 +547,7 @@ public class IntHashMap<V> implements Cloneable, Serializable
 	 */
 	public void clear()
 	{
-		modCount++;
+		modCount.incrementAndGet();
 		Entry<V> tab[] = table;
 		for (int i = 0; i < tab.length; i++)
 		{
@@ -619,7 +620,7 @@ public class IntHashMap<V> implements Cloneable, Serializable
 			result = (IntHashMap<V>)super.clone();
 			result.table = new Entry[table.length];
 			result.entrySet = null;
-			result.modCount = 0;
+			result.modCount.set(0);
 			result.size = 0;
 			result.init();
 			result.putAllForCreate(this);
@@ -773,7 +774,7 @@ public class IntHashMap<V> implements Cloneable, Serializable
 
 		HashIterator()
 		{
-			expectedModCount = modCount;
+			expectedModCount = modCount.get();
 			Entry<V>[] t = table;
 			int i = t.length;
 			Entry<V> n = null;
@@ -799,7 +800,7 @@ public class IntHashMap<V> implements Cloneable, Serializable
 
 		Entry<V> nextEntry()
 		{
-			if (modCount != expectedModCount)
+			if (!modCount.compareAndSet(expectedModCount, expectedModCount))
 			{
 				throw new ConcurrentModificationException();
 			}
@@ -831,14 +832,14 @@ public class IntHashMap<V> implements Cloneable, Serializable
 			{
 				throw new IllegalStateException();
 			}
-			if (modCount != expectedModCount)
+			if (!modCount.compareAndSet(expectedModCount, expectedModCount))
 			{
 				throw new ConcurrentModificationException();
 			}
 			int k = current.key;
 			current = null;
 			removeEntryForKey(k);
-			expectedModCount = modCount;
+			expectedModCount = modCount.get();
 		}
 
 	}
@@ -1175,4 +1176,4 @@ public class IntHashMap<V> implements Cloneable, Serializable
 	{
 		return loadFactor;
 	}
-}
\ No newline at end of file
+}