8185092: Data race in FilterOutputStream.close
Summary: Change boolean instance variable "closed" to an AtomicBoolean.
Reviewed-by: martin, alanb, redestad
--- a/jdk/src/java.base/share/classes/java/io/FilterOutputStream.java Wed Jul 26 14:09:20 2017 -0700
+++ b/jdk/src/java.base/share/classes/java/io/FilterOutputStream.java Thu Jul 27 13:13:19 2017 -0700
@@ -50,7 +50,12 @@
/**
* Whether the stream is closed; implicitly initialized to false.
*/
- private boolean closed;
+ private volatile boolean closed;
+
+ /**
+ * Object used to prevent a race on the 'closed' instance variable.
+ */
+ private final Object closeLock = new Object();
/**
* Creates an output stream filter built on top of the specified
@@ -165,7 +170,12 @@
if (closed) {
return;
}
- closed = true;
+ synchronized (closeLock) {
+ if (closed) {
+ return;
+ }
+ closed = true;
+ }
Throwable flushException = null;
try {