src/share/classes/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java

Print this page

        

*** 43,68 **** * classes. This class is designed for use in atomic data structures * in which several reference fields of the same node are * independently subject to atomic updates. For example, a tree node * might be declared as * ! * <pre> * class Node { * private volatile Node left, right; * ! * private static final AtomicReferenceFieldUpdater&lt;Node, Node&gt; leftUpdater = * AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left"); ! * private static AtomicReferenceFieldUpdater&lt;Node, Node&gt; rightUpdater = * AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "right"); * * Node getLeft() { return left; } * boolean compareAndSetLeft(Node expect, Node update) { * return leftUpdater.compareAndSet(this, expect, update); * } * // ... and so on ! * } ! * </pre> * * <p>Note that the guarantees of the {@code compareAndSet} * method in this class are weaker than in other atomic classes. * Because this class cannot ensure that all uses of the field * are appropriate for purposes of atomic access, it can --- 43,67 ---- * classes. This class is designed for use in atomic data structures * in which several reference fields of the same node are * independently subject to atomic updates. For example, a tree node * might be declared as * ! * <pre> {@code * class Node { * private volatile Node left, right; * ! * private static final AtomicReferenceFieldUpdater<Node, Node> leftUpdater = * AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left"); ! * private static AtomicReferenceFieldUpdater<Node, Node> rightUpdater = * AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "right"); * * Node getLeft() { return left; } * boolean compareAndSetLeft(Node expect, Node update) { * return leftUpdater.compareAndSet(this, expect, update); * } * // ... and so on ! * }}</pre> * * <p>Note that the guarantees of the {@code compareAndSet} * method in this class are weaker than in other atomic classes. * Because this class cannot ensure that all uses of the field * are appropriate for purposes of atomic access, it can
*** 289,299 **** private void ensureProtectedAccess(T obj) { if (cclass.isInstance(obj)) { return; } ! throw new RuntimeException ( new IllegalAccessException("Class " + cclass.getName() + " can not access a protected member of class " + tclass.getName() + " using an instance of " + --- 288,298 ---- private void ensureProtectedAccess(T obj) { if (cclass.isInstance(obj)) { return; } ! throw new RuntimeException( new IllegalAccessException("Class " + cclass.getName() + " can not access a protected member of class " + tclass.getName() + " using an instance of " +