org.glassfish.json.BufferPoolImpl Maven / Gradle / Ivy
/*
* Copyright (c) 2013, 2017 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package org.glassfish.json;
import org.glassfish.json.api.BufferPool;
import java.lang.ref.WeakReference;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* char[] pool that pool instances of char[] which are expensive to create.
*
* @author Jitendra Kotamraju
*/
class BufferPoolImpl implements BufferPool {
// volatile since multiple threads may access queue reference
private volatile WeakReference> queue;
/**
* Gets a new object from the pool.
*
*
* If no object is available in the pool, this method creates a new one.
*
* @return
* always non-null.
*/
@Override
public final char[] take() {
char[] t = getQueue().poll();
if (t==null)
return new char[4096];
return t;
}
private ConcurrentLinkedQueue getQueue() {
WeakReference> q = queue;
if (q != null) {
ConcurrentLinkedQueue d = q.get();
if (d != null)
return d;
}
// overwrite the queue
ConcurrentLinkedQueue d = new ConcurrentLinkedQueue<>();
queue = new WeakReference<>(d);
return d;
}
/**
* Returns an object back to the pool.
*/
@Override
public final void recycle(char[] t) {
getQueue().offer(t);
}
}