RFR: 8310530: PipedOutputStream.flush() accesses sink racily [v2]
Daniel Fuchs
dfuchs at openjdk.org
Wed Jun 21 15:03:13 UTC 2023
On Wed, 21 Jun 2023 14:27:26 GMT, Chen Liang <liach at openjdk.org> wrote:
>> src/java.base/share/classes/java/io/PipedOutputStream.java line 166:
>>
>>> 164: @Override
>>> 165: public synchronized void flush() throws IOException {
>>> 166: PipedInputStream sink = this.sink;
>>
>> Suggestion:
>>
>> var sink = this.sink;
>>
>> As seen in other methods.
>
> On second thought, this is probably not necessary; write to the sink field is in another synchronized method, and this method is synchronized already. Is the goal here to remove the synchronized on flush?
Good observation. Removing `synchronized` on flush might be a worthwhile goal but possible side effects (including on potential subclasses) should be carefully considered.
I support stashing `sink` in a local variable though, even if the pointer can't be concurrently modified, just to make it clear that we only have one volatile read.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/14589#discussion_r1237152608
More information about the core-libs-dev
mailing list