< prev index next >
src/java.base/share/classes/jdk/internal/util/concurrent/AbstractClassLoaderValue.java
Print this page
*** 19,34 ****
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
! package java.lang.reflect;
import jdk.internal.loader.BootLoader;
import jdk.internal.misc.JavaLangAccess;
import jdk.internal.misc.SharedSecrets;
import java.util.Iterator;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
import java.util.function.Supplier;
--- 19,35 ----
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
! package jdk.internal.util.concurrent;
import jdk.internal.loader.BootLoader;
import jdk.internal.misc.JavaLangAccess;
import jdk.internal.misc.SharedSecrets;
+ import java.lang.reflect.UndeclaredThrowableException;
import java.util.Iterator;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
import java.util.function.Supplier;
*** 38,48 ****
* and {@link Sub sub}-ClassLoaderValue.
*
* @param <CLV> the type of concrete ClassLoaderValue (this type)
* @param <V> the type of values associated with ClassLoaderValue
*/
! abstract class AbstractClassLoaderValue<CLV extends AbstractClassLoaderValue<CLV, V>, V> {
/**
* Sole constructor.
*/
AbstractClassLoaderValue() {}
--- 39,49 ----
* and {@link Sub sub}-ClassLoaderValue.
*
* @param <CLV> the type of concrete ClassLoaderValue (this type)
* @param <V> the type of values associated with ClassLoaderValue
*/
! public abstract class AbstractClassLoaderValue<CLV extends AbstractClassLoaderValue<CLV, V>, V> {
/**
* Sole constructor.
*/
AbstractClassLoaderValue() {}
*** 149,158 ****
--- 150,177 ----
public boolean remove(ClassLoader cl, Object v) {
return AbstractClassLoaderValue.<CLV>map(cl).remove(this, v);
}
/**
+ * Replaces the value associated with this ClassLoaderValue and given
+ * ClassLoader with {@code newV} if the associated value is equal to given
+ * value {@code oldV} and returns {@code true} or does nothing and returns
+ * {@code false} if there is no currently associated value or it is not equal
+ * to given value {@code oldV}.
+ *
+ * @param cl the ClassLoader for the associated value
+ * @param oldV the value to compare with currently associated value
+ * @param newV the value to associate if current value is equal to oldV
+ * @return {@code true} if the association was replaced or {@code false} if not
+ */
+ public boolean replace(ClassLoader cl, V oldV, V newV) {
+ @SuppressWarnings("unchecked")
+ CLV clv = (CLV) this;
+ return AbstractClassLoaderValue.<CLV>map(cl).replace(clv, oldV, newV);
+ }
+
+ /**
* Returns the value associated with this ClassLoaderValue and given
* ClassLoader if there is one or computes the value by invoking given
* {@code mappingFunction}, associates it and returns it.
* <p>
* Computation and association of the computed value is performed atomically
*** 375,385 ****
* sub-[sub-...]ClassLoaderValue instance in a type-safe way.
*
* @param <K> the type of {@link #key()} component contained in the
* sub-ClassLoaderValue.
*/
! final class Sub<K> extends AbstractClassLoaderValue<Sub<K>, V> {
private final K key;
Sub(K key) {
this.key = key;
--- 394,404 ----
* sub-[sub-...]ClassLoaderValue instance in a type-safe way.
*
* @param <K> the type of {@link #key()} component contained in the
* sub-ClassLoaderValue.
*/
! public final class Sub<K> extends AbstractClassLoaderValue<Sub<K>, V> {
private final K key;
Sub(K key) {
this.key = key;
< prev index next >