# HG changeset patch # User redestad # Date 1539088206 -7200 # Node ID e7703e42976709c5042f7914d518e5a90126ac83 # Parent 7ecbaece746fddaa4adee5ecc09e7fefa1960119 8211859: Avoid initializing AtomicBoolean from RandomAccessFile Reviewed-by: alanb diff -r 7ecbaece746f -r e7703e429767 src/java.base/share/classes/java/io/RandomAccessFile.java --- a/src/java.base/share/classes/java/io/RandomAccessFile.java Tue Oct 09 13:31:50 2018 +0100 +++ b/src/java.base/share/classes/java/io/RandomAccessFile.java Tue Oct 09 14:30:06 2018 +0200 @@ -71,7 +71,9 @@ */ private final String path; - private final AtomicBoolean closed = new AtomicBoolean(false); + private final Object closeLock = new Object(); + + private volatile boolean closed; private static final int O_RDONLY = 1; private static final int O_RDWR = 2; @@ -301,7 +303,7 @@ if (fc == null) { this.channel = fc = FileChannelImpl.open(fd, path, true, rw, false, this); - if (closed.get()) { + if (closed) { try { fc.close(); } catch (IOException ioe) { @@ -638,14 +640,21 @@ * @spec JSR-51 */ public void close() throws IOException { - if (!closed.compareAndSet(false, true)) { - // if compareAndSet() returns false closed was already true + if (closed) { return; } + synchronized (closeLock) { + if (closed) { + return; + } + closed = true; + } FileChannel fc = channel; if (fc != null) { - fc.close(); + // possible race with getChannel(), benign since + // FileChannel.close is final and idempotent + fc.close(); } fd.closeAll(new Closeable() {