Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 4B95A200CDE for ; Tue, 8 Aug 2017 23:08:46 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 4A341167FC7; Tue, 8 Aug 2017 21:08:46 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 6407C167FC4 for ; Tue, 8 Aug 2017 23:08:45 +0200 (CEST) Received: (qmail 72877 invoked by uid 500); 8 Aug 2017 21:08:44 -0000 Mailing-List: contact commits-help@hc.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "HttpComponents Project" Delivered-To: mailing list commits@hc.apache.org Received: (qmail 72868 invoked by uid 99); 8 Aug 2017 21:08:44 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 08 Aug 2017 21:08:44 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 7E195E9456; Tue, 8 Aug 2017 21:08:44 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: olegk@apache.org To: commits@hc.apache.org Message-Id: <41a4891fa4b84a519df089e20f08ad0f@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: httpcomponents-client git commit: BasicCookieStore no longer synchronizes on reads Date: Tue, 8 Aug 2017 21:08:44 +0000 (UTC) archived-at: Tue, 08 Aug 2017 21:08:46 -0000 Repository: httpcomponents-client Updated Branches: refs/heads/4.5.x 73ace1485 -> dd4da037c BasicCookieStore no longer synchronizes on reads BasicCookieStore uses a ReentrantReadWriteLock to avoid synchronization on getCookies/toString while maintaining thread safety. Project: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/repo Commit: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/commit/dd4da037 Tree: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/tree/dd4da037 Diff: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/diff/dd4da037 Branch: refs/heads/4.5.x Commit: dd4da037c717e436fac35b98942079a269cb4765 Parents: 73ace14 Author: Carter Kozak Authored: Mon Aug 7 09:47:04 2017 -0400 Committer: Oleg Kalnichevski Committed: Tue Aug 8 14:50:52 2017 +0200 ---------------------------------------------------------------------- .../http/impl/client/BasicCookieStore.java | 73 ++++++++++++++------ 1 file changed, 51 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/httpcomponents-client/blob/dd4da037/httpclient/src/main/java/org/apache/http/impl/client/BasicCookieStore.java ---------------------------------------------------------------------- diff --git a/httpclient/src/main/java/org/apache/http/impl/client/BasicCookieStore.java b/httpclient/src/main/java/org/apache/http/impl/client/BasicCookieStore.java index d2468f6..c536c6e 100644 --- a/httpclient/src/main/java/org/apache/http/impl/client/BasicCookieStore.java +++ b/httpclient/src/main/java/org/apache/http/impl/client/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.http.annotation.Contract; import org.apache.http.annotation.ThreadingBehavior; @@ -51,10 +53,12 @@ public class BasicCookieStore implements CookieStore, Serializable { private static final long serialVersionUID = -7581093305228232025L; private final TreeSet cookies; + private final ReadWriteLock lock; public BasicCookieStore() { super(); this.cookies = new TreeSet(new CookieIdentityComparator()); + this.lock = new ReentrantReadWriteLock(); } /** @@ -68,12 +72,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(); } } } @@ -88,10 +97,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); } } } @@ -103,9 +112,14 @@ public class BasicCookieStore implements CookieStore, Serializable { * @return an array of {@link Cookie cookies}. */ @Override - public synchronized List getCookies() { - //create defensive copy so it won't be concurrently modified - return new ArrayList(cookies); + public List getCookies() { + lock.readLock().lock(); + try { + //create defensive copy so it won't be concurrently modified + return new ArrayList(cookies); + } finally { + lock.readLock().unlock(); + } } /** @@ -117,31 +131,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 it = cookies.iterator(); it.hasNext();) { - if (it.next().isExpired(date)) { - it.remove(); - removed = true; + lock.writeLock().lock(); + try { + boolean removed = false; + for (final Iterator 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(); + } } }