jdk/src/java.base/share/classes/java/lang/ref/Cleaner.java
author plevart
Wed, 09 Mar 2016 21:17:06 +0100
changeset 36435 0408881ad616
parent 34942 4b462ee18ed9
child 44844 b2b4d98404ba
permissions -rw-r--r--
8149925: We don't need jdk.internal.ref.Cleaner any more - part1 Summary: 1st part of removing legacy jdk.internal.ref.Cleaner Reviewed-by: chegar, mchung
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34724
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
     1
/*
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
     2
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
     4
 *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    10
 *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    15
 * accompanied this code).
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    16
 *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    20
 *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    23
 * questions.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    24
 */
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    25
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    26
package java.lang.ref;
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    27
36435
0408881ad616 8149925: We don't need jdk.internal.ref.Cleaner any more - part1
plevart
parents: 34942
diff changeset
    28
import jdk.internal.ref.CleanerImpl;
0408881ad616 8149925: We don't need jdk.internal.ref.Cleaner any more - part1
plevart
parents: 34942
diff changeset
    29
34724
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    30
import java.util.Objects;
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    31
import java.util.concurrent.ThreadFactory;
36435
0408881ad616 8149925: We don't need jdk.internal.ref.Cleaner any more - part1
plevart
parents: 34942
diff changeset
    32
import java.util.function.Function;
34724
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    33
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    34
/**
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    35
 * {@code Cleaner} manages a set of object references and corresponding cleaning actions.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    36
 * <p>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    37
 * Cleaning actions are {@link #register(Object object, Runnable action) registered}
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    38
 * to run after the cleaner is notified that the object has become
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    39
 * phantom reachable.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    40
 * The cleaner uses {@link PhantomReference} and {@link ReferenceQueue} to be
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    41
 * notified when the <a href="package-summary.html#reachability">reachability</a>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    42
 * changes.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    43
 * <p>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    44
 * Each cleaner operates independently, managing the pending cleaning actions
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    45
 * and handling threading and termination when the cleaner is no longer in use.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    46
 * Registering an object reference and corresponding cleaning action returns
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    47
 * a {@link Cleanable Cleanable}. The most efficient use is to explicitly invoke
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    48
 * the {@link Cleanable#clean clean} method when the object is closed or
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    49
 * no longer needed.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    50
 * The cleaning action is a {@link Runnable} to be invoked at most once when
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    51
 * the object has become phantom reachable unless it has already been explicitly cleaned.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    52
 * Note that the cleaning action must not refer to the object being registered.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    53
 * If so, the object will not become phantom reachable and the cleaning action
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    54
 * will not be invoked automatically.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    55
 * <p>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    56
 * The execution of the cleaning action is performed
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    57
 * by a thread associated with the cleaner.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    58
 * All exceptions thrown by the cleaning action are ignored.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    59
 * The cleaner and other cleaning actions are not affected by
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    60
 * exceptions in a cleaning action.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    61
 * The thread runs until all registered cleaning actions have
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    62
 * completed and the cleaner itself is reclaimed by the garbage collector.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    63
 * <p>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    64
 * The behavior of cleaners during {@link System#exit(int) System.exit}
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    65
 * is implementation specific. No guarantees are made relating
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    66
 * to whether cleaning actions are invoked or not.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    67
 * <p>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    68
 * Unless otherwise noted, passing a {@code null} argument to a constructor or
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    69
 * method in this class will cause a
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    70
 * {@link java.lang.NullPointerException NullPointerException} to be thrown.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    71
 *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    72
 * @apiNote
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    73
 * The cleaning action is invoked only after the associated object becomes
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    74
 * phantom reachable, so it is important that the object implementing the
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    75
 * cleaning action does not hold references to the object.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    76
 * In this example, a static class encapsulates the cleaning state and action.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    77
 * An "inner" class, anonymous or not,  must not be used because it implicitly
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    78
 * contains a reference to the outer instance, preventing it from becoming
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    79
 * phantom reachable.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    80
 * The choice of a new cleaner or sharing an existing cleaner is determined
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    81
 * by the use case.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    82
 * <p>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    83
 * If the CleaningExample is used in a try-finally block then the
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    84
 * {@code close} method calls the cleaning action.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    85
 * If the {@code close} method is not called, the cleaning action is called
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    86
 * by the Cleaner when the CleaningExample instance has become phantom reachable.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    87
 * <pre>{@code
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    88
 * public class CleaningExample implements AutoCloseable {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    89
 *        // A cleaner, preferably one shared within a library
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    90
 *        private static final Cleaner cleaner = <cleaner>;
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    91
 *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    92
 *        static class State implements Runnable {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    93
 *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    94
 *            State(...) {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    95
 *                // initialize State needed for cleaning action
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    96
 *            }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    97
 *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    98
 *            public void run() {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
    99
 *                // cleanup action accessing State, executed at most once
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   100
 *            }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   101
 *        }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   102
 *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   103
 *        private final State;
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   104
 *        private final Cleaner.Cleanable cleanable
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   105
 *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   106
 *        public CleaningExample() {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   107
 *            this.state = new State(...);
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   108
 *            this.cleanable = cleaner.register(this, state);
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   109
 *        }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   110
 *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   111
 *        public void close() {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   112
 *            cleanable.clean();
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   113
 *        }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   114
 *    }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   115
 * }</pre>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   116
 * The cleaning action could be a lambda but all too easily will capture
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   117
 * the object reference, by referring to fields of the object being cleaned,
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   118
 * preventing the object from becoming phantom reachable.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   119
 * Using a static nested class, as above, will avoid accidentally retaining the
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   120
 * object reference.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   121
 * <p>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   122
 * <a name="compatible-cleaners"></a>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   123
 * Cleaning actions should be prepared to be invoked concurrently with
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   124
 * other cleaning actions.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   125
 * Typically the cleaning actions should be very quick to execute
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   126
 * and not block. If the cleaning action blocks, it may delay processing
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   127
 * other cleaning actions registered to the same cleaner.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   128
 * All cleaning actions registered to a cleaner should be mutually compatible.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   129
 * @since 9
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   130
 */
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   131
public final class Cleaner {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   132
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   133
    /**
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   134
     * The Cleaner implementation.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   135
     */
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   136
    final CleanerImpl impl;
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   137
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   138
    static {
36435
0408881ad616 8149925: We don't need jdk.internal.ref.Cleaner any more - part1
plevart
parents: 34942
diff changeset
   139
        CleanerImpl.setCleanerImplAccess(new Function<Cleaner, CleanerImpl>() {
0408881ad616 8149925: We don't need jdk.internal.ref.Cleaner any more - part1
plevart
parents: 34942
diff changeset
   140
            @Override
0408881ad616 8149925: We don't need jdk.internal.ref.Cleaner any more - part1
plevart
parents: 34942
diff changeset
   141
            public CleanerImpl apply(Cleaner cleaner) {
0408881ad616 8149925: We don't need jdk.internal.ref.Cleaner any more - part1
plevart
parents: 34942
diff changeset
   142
                return cleaner.impl;
0408881ad616 8149925: We don't need jdk.internal.ref.Cleaner any more - part1
plevart
parents: 34942
diff changeset
   143
            }
0408881ad616 8149925: We don't need jdk.internal.ref.Cleaner any more - part1
plevart
parents: 34942
diff changeset
   144
        });
34724
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   145
    }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   146
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   147
    /**
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   148
     * Construct a Cleaner implementation and start it.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   149
     */
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   150
    private Cleaner() {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   151
        impl = new CleanerImpl();
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   152
    }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   153
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   154
    /**
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   155
     * Returns a new {@code Cleaner}.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   156
     * <p>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   157
     * The cleaner creates a {@link Thread#setDaemon(boolean) daemon thread}
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   158
     * to process the phantom reachable objects and to invoke cleaning actions.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   159
     * The {@linkplain java.lang.Thread#getContextClassLoader context class loader}
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   160
     * of the thread is set to the
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   161
     * {@link ClassLoader#getSystemClassLoader() system class loader}.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   162
     * The thread has no permissions, enforced only if a
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   163
     * {@link java.lang.System#setSecurityManager(SecurityManager) SecurityManager is set}.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   164
     * <p>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   165
     * The cleaner terminates when it is phantom reachable and all of the
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   166
     * registered cleaning actions are complete.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   167
     *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   168
     * @return a new {@code Cleaner}
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   169
     *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   170
     * @throws  SecurityException  if the current thread is not allowed to
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   171
     *               create or start the thread.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   172
     */
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   173
    public static Cleaner create() {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   174
        Cleaner cleaner = new Cleaner();
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   175
        cleaner.impl.start(cleaner, null);
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   176
        return cleaner;
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   177
    }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   178
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   179
    /**
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   180
     * Returns a new {@code Cleaner} using a {@code Thread} from the {@code ThreadFactory}.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   181
     * <p>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   182
     * A thread from the thread factory's {@link ThreadFactory#newThread(Runnable) newThread}
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   183
     * method is set to be a {@link Thread#setDaemon(boolean) daemon thread}
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   184
     * and started to process phantom reachable objects and invoke cleaning actions.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   185
     * On each call the {@link ThreadFactory#newThread(Runnable) thread factory}
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   186
     * must provide a Thread that is suitable for performing the cleaning actions.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   187
     * <p>
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   188
     * The cleaner terminates when it is phantom reachable and all of the
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   189
     * registered cleaning actions are complete.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   190
     *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   191
     * @param threadFactory a {@code ThreadFactory} to return a new {@code Thread}
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   192
     *                      to process cleaning actions
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   193
     * @return a new {@code Cleaner}
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   194
     *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   195
     * @throws  IllegalThreadStateException  if the thread from the thread
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   196
     *               factory was {@link Thread.State#NEW not a new thread}.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   197
     * @throws  SecurityException  if the current thread is not allowed to
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   198
     *               create or start the thread.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   199
     */
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   200
    public static Cleaner create(ThreadFactory threadFactory) {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   201
        Objects.requireNonNull(threadFactory, "threadFactory");
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   202
        Cleaner cleaner = new Cleaner();
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   203
        cleaner.impl.start(cleaner, threadFactory);
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   204
        return cleaner;
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   205
    }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   206
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   207
    /**
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   208
     * Registers an object and a cleaning action to run when the object
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   209
     * becomes phantom reachable.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   210
     * Refer to the <a href="#compatible-cleaners">API Note</a> above for
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   211
     * cautions about the behavior of cleaning actions.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   212
     *
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   213
     * @param obj   the object to monitor
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   214
     * @param action a {@code Runnable} to invoke when the object becomes phantom reachable
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   215
     * @return a {@code Cleanable} instance
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   216
     */
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   217
    public Cleanable register(Object obj, Runnable action) {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   218
        Objects.requireNonNull(obj, "obj");
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   219
        Objects.requireNonNull(action, "action");
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   220
        return new CleanerImpl.PhantomCleanableRef(obj, this, action);
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   221
    }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   222
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   223
    /**
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   224
     * {@code Cleanable} represents an object and a
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   225
     * cleaning action registered in a {@code Cleaner}.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   226
     * @since 9
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   227
     */
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   228
    public interface Cleanable {
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   229
        /**
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   230
         * Unregisters the cleanable and invokes the cleaning action.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   231
         * The cleanable's cleaning action is invoked at most once
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   232
         * regardless of the number of calls to {@code clean}.
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   233
         */
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   234
        void clean();
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   235
    }
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   236
e664c5672743 8138696: java.lang.ref.Cleaner - an easy to use alternative to finalization
rriggs
parents:
diff changeset
   237
}