diff -r 5ff0a80ee6c7 src/java.base/share/classes/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.java --- a/src/java.base/share/classes/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.java Tue Oct 27 01:45:03 2015 -0400 +++ b/src/java.base/share/classes/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.java Wed Nov 04 21:28:14 2015 +0300 @@ -429,8 +429,20 @@ } private void fullCheck(T obj) { + typeCheck(obj); + accessCheck(obj); + } + + static void throwCCE() { + throw new ClassCastException(); + } + + private void typeCheck(T obj) { if (!tclass.isInstance(obj)) - throw new ClassCastException(); + throwCCE(); + } + + private void accessCheck(T obj) { if (cclass != null) ensureProtectedAccess(obj); } @@ -456,7 +468,8 @@ } public final int get(T obj) { - if (obj == null || obj.getClass() != tclass || cclass != null) fullCheck(obj); + typeCheck(obj); + accessCheck(obj); return U.getIntVolatile(obj, offset); } diff -r 5ff0a80ee6c7 src/java.base/share/classes/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java --- a/src/java.base/share/classes/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java Tue Oct 27 01:45:03 2015 -0400 +++ b/src/java.base/share/classes/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java Wed Nov 04 21:28:14 2015 +0300 @@ -373,6 +373,25 @@ ensureProtectedAccess(obj); } + static void throwCCE() { + throw new ClassCastException(); + } + + void accessCheck(T obj) { + if (cclass != null) + ensureProtectedAccess(obj); + } + + void typeCheck_1(T obj) { + if (!tclass.isInstance(obj)) + throwCCE(); + } + + void typeCheck_2(T obj, V update) { + if (vclass != null && !vclass.isInstance(update)) + throwCCE(); + } + void updateCheck(T obj, V update) { if (!tclass.isInstance(obj) || (update != null && vclass != null && !vclass.isInstance(update))) @@ -399,10 +418,9 @@ } public void set(T obj, V newValue) { - if (obj == null || obj.getClass() != tclass || cclass != null || - (newValue != null && vclass != null && - vclass != newValue.getClass())) - updateCheck(obj, newValue); + typeCheck_1(obj); + typeCheck_2(obj, newValue); + accessCheck(obj); U.putObjectVolatile(obj, offset, newValue); }