You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2017/08/08 21:08:20 UTC

httpcomponents-client git commit: BasicCookieStore no longer synchronizes on reads

Repository: httpcomponents-client
Updated Branches:
  refs/heads/master 9efcba873 -> a10967a42


BasicCookieStore no longer synchronizes on reads

BasicCookieStore uses a ReentrantReadWriteLock to avoid
synchronization on getCookies/toString while maintaining
thread safety.

Closes PR #81


Project: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/commit/a10967a4
Tree: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/tree/a10967a4
Diff: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/diff/a10967a4

Branch: refs/heads/master
Commit: a10967a427394844e9b90b9630f7f71f2ee0319a
Parents: 9efcba8
Author: Carter Kozak <c4...@gmail.com>
Authored: Mon Aug 7 09:47:04 2017 -0400
Committer: Oleg Kalnichevski <ol...@apache.org>
Committed: Tue Aug 8 23:07:52 2017 +0200

----------------------------------------------------------------------
 .../client5/http/cookie/BasicCookieStore.java   | 73 ++++++++++++++------
 1 file changed, 51 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/httpcomponents-client/blob/a10967a4/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java
----------------------------------------------------------------------
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java
index 4d3e0af..b787452 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java
@@ -32,6 +32,8 @@ import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.TreeSet;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.apache.hc.core5.annotation.Contract;
 import org.apache.hc.core5.annotation.ThreadingBehavior;
@@ -48,10 +50,12 @@ public class BasicCookieStore implements CookieStore, Serializable {
     private static final long serialVersionUID = -7581093305228232025L;
 
     private final TreeSet<Cookie> cookies;
+    private final ReadWriteLock lock;
 
     public BasicCookieStore() {
         super();
         this.cookies = new TreeSet<>(new CookieIdentityComparator());
+        this.lock = new ReentrantReadWriteLock();
     }
 
     /**
@@ -65,12 +69,17 @@ public class BasicCookieStore implements CookieStore, Serializable {
      *
      */
     @Override
-    public synchronized void addCookie(final Cookie cookie) {
+    public void addCookie(final Cookie cookie) {
         if (cookie != null) {
-            // first remove any old cookie that is equivalent
-            cookies.remove(cookie);
-            if (!cookie.isExpired(new Date())) {
-                cookies.add(cookie);
+            lock.writeLock().lock();
+            try {
+                // first remove any old cookie that is equivalent
+                cookies.remove(cookie);
+                if (!cookie.isExpired(new Date())) {
+                    cookies.add(cookie);
+                }
+            } finally {
+                lock.writeLock().unlock();
             }
         }
     }
@@ -85,10 +94,10 @@ public class BasicCookieStore implements CookieStore, Serializable {
      * @see #addCookie(Cookie)
      *
      */
-    public synchronized void addCookies(final Cookie[] cookies) {
+    public void addCookies(final Cookie[] cookies) {
         if (cookies != null) {
-            for (final Cookie cooky : cookies) {
-                this.addCookie(cooky);
+            for (final Cookie cookie : cookies) {
+                this.addCookie(cookie);
             }
         }
     }
@@ -100,9 +109,14 @@ public class BasicCookieStore implements CookieStore, Serializable {
      * @return an array of {@link Cookie cookies}.
      */
     @Override
-    public synchronized List<Cookie> getCookies() {
-        //create defensive copy so it won't be concurrently modified
-        return new ArrayList<>(cookies);
+    public List<Cookie> getCookies() {
+        lock.readLock().lock();
+        try {
+            //create defensive copy so it won't be concurrently modified
+            return new ArrayList<>(cookies);
+        } finally {
+            lock.readLock().unlock();
+        }
     }
 
     /**
@@ -114,31 +128,46 @@ public class BasicCookieStore implements CookieStore, Serializable {
      * @see Cookie#isExpired(Date)
      */
     @Override
-    public synchronized boolean clearExpired(final Date date) {
+    public boolean clearExpired(final Date date) {
         if (date == null) {
             return false;
         }
-        boolean removed = false;
-        for (final Iterator<Cookie> it = cookies.iterator(); it.hasNext();) {
-            if (it.next().isExpired(date)) {
-                it.remove();
-                removed = true;
+        lock.writeLock().lock();
+        try {
+            boolean removed = false;
+            for (final Iterator<Cookie> it = cookies.iterator(); it.hasNext(); ) {
+                if (it.next().isExpired(date)) {
+                    it.remove();
+                    removed = true;
+                }
             }
+            return removed;
+        } finally {
+            lock.writeLock().unlock();
         }
-        return removed;
     }
 
     /**
      * Clears all cookies.
      */
     @Override
-    public synchronized void clear() {
-        cookies.clear();
+    public void clear() {
+        lock.writeLock().lock();
+        try {
+            cookies.clear();
+        } finally {
+            lock.writeLock().unlock();
+        }
     }
 
     @Override
-    public synchronized String toString() {
-        return cookies.toString();
+    public String toString() {
+        lock.readLock().lock();
+        try {
+            return cookies.toString();
+        } finally {
+            lock.readLock().unlock();
+        }
     }
 
 }