< prev index next >
src/java.base/share/classes/jdk/internal/ref/CleanerFactory.java
Print this page
@@ -24,10 +24,11 @@
*/
package jdk.internal.ref;
import jdk.internal.misc.InnocuousThread;
+import jdk.internal.vm.annotation.ReservedStackAccess;
import java.lang.ref.Cleaner;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.concurrent.ThreadFactory;
@@ -36,12 +37,13 @@
* CleanerFactory provides a Cleaner for use within system modules.
* The cleaner is created on the first reference to the CleanerFactory.
*/
public final class CleanerFactory {
- /* The common Cleaner. */
- private final static Cleaner commonCleaner = Cleaner.create(new ThreadFactory() {
+ /* The common Cleaner. Lazily initialized */
+ private static class Common {
+ static final Cleaner INSTANCE = Cleaner.create(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return AccessController.doPrivileged(new PrivilegedAction<>() {
@Override
public Thread run() {
@@ -50,19 +52,54 @@
return t;
}
});
}
});
+ }
+
+ /* The NIO DirectByteBuffer ExtendedCleaner. Lazily initialized */
+ private static class DBB {
+ static final ExtendedCleaner INSTANCE = ExtendedCleaner.create(new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable r) {
+ return AccessController.doPrivileged(new PrivilegedAction<>() {
+ @Override
+ public Thread run() {
+ Thread t = InnocuousThread.newSystemThread("DirectByteBuffer-Cleaner", r);
+ t.setPriority(Thread.MAX_PRIORITY - 2);
+ return t;
+ }
+ });
+ }
+ });
+ }
/**
* Cleaner for use within system modules.
- *
+ * <p>
* This Cleaner will run on a thread whose context class loader
* is {@code null}. The system cleaning action to perform in
* this Cleaner should handle a {@code null} context class loader.
*
* @return a Cleaner for use within system modules
*/
public static Cleaner cleaner() {
- return commonCleaner;
+ return Common.INSTANCE;
+ }
+
+ /**
+ * ExtendedCleaner for DirectByteBuffer use.
+ * <p>
+ * This Cleaner will mostly run on a background thread whose
+ * context class loader is {@code null}. But since this is
+ * {@link ExtendedCleaner} it allows other threads to help executing
+ * cleaning actions. Cleaning actions to be performed in this ExtendedCleaner
+ * should handle a {@code null} context class loader and any application
+ * thread. When they are executed by an application thread they are
+ * executed in the context of {@link ReservedStackAccess} annotation.
+ *
+ * @return an ExtendedCleaner for use in DirectByteBuffer
+ */
+ public static ExtendedCleaner dbbCleaner() {
+ return DBB.INSTANCE;
}
}
< prev index next >