@@ -61,9 +61,9 @@ public class ConcurrentBag<T extends IConcurrentBagEntry> implements AutoCloseab
61
61
private static final Logger LOGGER = LoggerFactory .getLogger (ConcurrentBag .class );
62
62
63
63
private final CopyOnWriteArrayList <T > sharedList ;
64
- private final boolean weakThreadLocals ;
64
+ private final boolean useWeakThreadLocals ;
65
65
66
- private final ThreadLocal <List <Object >> threadList ;
66
+ private final ThreadLocal <List <Object >> threadLocalList ;
67
67
private final IBagStateListener listener ;
68
68
private final AtomicInteger waiters ;
69
69
private volatile boolean closed ;
@@ -95,17 +95,14 @@ public interface IBagStateListener
95
95
public ConcurrentBag (final IBagStateListener listener )
96
96
{
97
97
this .listener = listener ;
98
- this .weakThreadLocals = useWeakThreadLocals ();
98
+ this .useWeakThreadLocals = useWeakThreadLocals ();
99
99
100
100
this .handoffQueue = new SynchronousQueue <>(true );
101
101
this .waiters = new AtomicInteger ();
102
102
this .sharedList = new CopyOnWriteArrayList <>();
103
- if (weakThreadLocals ) {
104
- this .threadList = ThreadLocal .withInitial (() -> new ArrayList <>(16 ));
105
- }
106
- else {
107
- this .threadList = ThreadLocal .withInitial (() -> new FastList <>(IConcurrentBagEntry .class , 16 ));
108
- }
103
+ this .threadLocalList = ThreadLocal .withInitial (() ->
104
+ useWeakThreadLocals ? new ArrayList <>(16 ) : new FastList <>(IConcurrentBagEntry .class , 16 )
105
+ );
109
106
}
110
107
111
108
/**
@@ -120,18 +117,18 @@ public ConcurrentBag(final IBagStateListener listener)
120
117
public T borrow (long timeout , final TimeUnit timeUnit ) throws InterruptedException
121
118
{
122
119
// Try the thread-local list first
123
- final var list = threadList .get ();
124
- for (int i = list .size () - 1 ; i >= 0 ; i --) {
120
+ final var list = threadLocalList .get ();
121
+ for (var i = list .size () - 1 ; i >= 0 ; i --) {
125
122
final var entry = list .remove (i );
126
123
@ SuppressWarnings ("unchecked" )
127
- final T bagEntry = weakThreadLocals ? ((WeakReference <T >) entry ).get () : (T ) entry ;
124
+ final T bagEntry = useWeakThreadLocals ? ((WeakReference <T >) entry ).get () : (T ) entry ;
128
125
if (bagEntry != null && bagEntry .compareAndSet (STATE_NOT_IN_USE , STATE_IN_USE )) {
129
126
return bagEntry ;
130
127
}
131
128
}
132
129
133
130
// Otherwise, scan the shared list ... then poll the handoff queue
134
- final int waiting = waiters .incrementAndGet ();
131
+ final var waiting = waiters .incrementAndGet ();
135
132
try {
136
133
for (T bagEntry : sharedList ) {
137
134
if (bagEntry .compareAndSet (STATE_NOT_IN_USE , STATE_IN_USE )) {
@@ -188,9 +185,9 @@ else if ((i & 0xff) == 0xff) {
188
185
}
189
186
}
190
187
191
- final var threadLocalList = threadList .get ();
192
- if (threadLocalList .size () < 50 ) {
193
- threadLocalList .add (weakThreadLocals ? new WeakReference <>(bagEntry ) : bagEntry );
188
+ final var threadLocalEntries = this . threadLocalList .get ();
189
+ if (threadLocalEntries .size () < 16 ) {
190
+ threadLocalEntries .add (useWeakThreadLocals ? new WeakReference <>(bagEntry ) : bagEntry );
194
191
}
195
192
}
196
193
@@ -230,12 +227,12 @@ public boolean remove(final T bagEntry)
230
227
return false ;
231
228
}
232
229
233
- final boolean removed = sharedList .remove (bagEntry );
230
+ final var removed = sharedList .remove (bagEntry );
234
231
if (!removed && !closed ) {
235
232
LOGGER .warn ("Attempt to remove an object from the bag that does not exist: {}" , bagEntry );
236
233
}
237
234
238
- threadList .get ().remove (bagEntry );
235
+ threadLocalList .get ().remove (bagEntry );
239
236
240
237
return removed ;
241
238
}
@@ -307,7 +304,7 @@ public void unreserve(final T bagEntry)
307
304
{
308
305
if (bagEntry .compareAndSet (STATE_RESERVED , STATE_NOT_IN_USE )) {
309
306
// spin until a thread takes it or none are waiting
310
- while (waiters .get () > 0 && !handoffQueue .offer (bagEntry )) {
307
+ while (waiters .get () > 0 && bagEntry . getState () == STATE_NOT_IN_USE && !handoffQueue .offer (bagEntry )) {
311
308
Thread .yield ();
312
309
}
313
310
}
0 commit comments