Use WeakReferences to avoid Tomcat ThreadLocal leak warning.

pull/41/head
Brett Wooldridge 11 years ago
parent 8678a332ad
commit b82dec08b7

@ -15,6 +15,7 @@
*/ */
package com.zaxxer.hikari.util; package com.zaxxer.hikari.util;
import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -63,7 +64,7 @@ public class ConcurrentBag<T extends com.zaxxer.hikari.util.ConcurrentBag.IBagMa
boolean compareAndSetState(int expectedState, int newState); boolean compareAndSetState(int expectedState, int newState);
} }
private ThreadLocal<LinkedList<T>> threadList; private ThreadLocal<LinkedList<WeakReference<T>>> threadList;
private CopyOnWriteArraySet<T> sharedList; private CopyOnWriteArraySet<T> sharedList;
private Synchronizer synchronizer; private Synchronizer synchronizer;
@ -74,7 +75,7 @@ public class ConcurrentBag<T extends com.zaxxer.hikari.util.ConcurrentBag.IBagMa
{ {
this.sharedList = new CopyOnWriteArraySet<T>(); this.sharedList = new CopyOnWriteArraySet<T>();
this.synchronizer = new Synchronizer(); this.synchronizer = new Synchronizer();
this.threadList = new ThreadLocal<LinkedList<T>>(); this.threadList = new ThreadLocal<LinkedList<WeakReference<T>>>();
} }
/** /**
@ -89,19 +90,20 @@ public class ConcurrentBag<T extends com.zaxxer.hikari.util.ConcurrentBag.IBagMa
public T borrow(long timeout, TimeUnit timeUnit) throws InterruptedException public T borrow(long timeout, TimeUnit timeUnit) throws InterruptedException
{ {
// Try the thread-local list first // Try the thread-local list first
LinkedList<T> list = threadList.get(); LinkedList<WeakReference<T>> list = threadList.get();
if (list == null) if (list == null)
{ {
list = new LinkedList<T>(); list = new LinkedList<WeakReference<T>>();
threadList.set(list); threadList.set(list);
} }
while (!list.isEmpty()) while (!list.isEmpty())
{ {
final T reference = list.removeFirst(); final WeakReference<T> reference = list.removeFirst();
if (reference.compareAndSetState(STATE_NOT_IN_USE, STATE_IN_USE)) T element = reference.get();
if (element != null && element.compareAndSetState(STATE_NOT_IN_USE, STATE_IN_USE))
{ {
return reference; return element;
} }
} }
@ -144,7 +146,7 @@ public class ConcurrentBag<T extends com.zaxxer.hikari.util.ConcurrentBag.IBagMa
if (value.compareAndSetState(STATE_IN_USE, STATE_NOT_IN_USE)) if (value.compareAndSetState(STATE_IN_USE, STATE_NOT_IN_USE))
{ {
final long returnTime = System.nanoTime(); final long returnTime = System.nanoTime();
threadList.get().addLast(value); threadList.get().addLast(new WeakReference<T>(value));
synchronizer.releaseShared(returnTime); synchronizer.releaseShared(returnTime);
} }
else else

Loading…
Cancel
Save