On Wed, 13 Apr 2022 09:49:04 GMT, Daniel Fuchs <dfu...@openjdk.org> wrote:

>>> Not sure if that even matters - but there will be a slight change of 
>>> behaviour here if `InternalLock.CAN_USE_INTERNAL_LOCK` is ever `false`. 
>>> Instead of synchronizing on `in`, the `BufferedReader` will synchronize on 
>>> `this`.
>> 
>> Good!  We can change this so that depends on whether BufferedReader is 
>> extended and whether the given Reader is trusted. It's not clear if anyone 
>> could reliably depend on undocumented behavior like this but we have to be 
>> cautious at the same time.
>
> Thanks - the same issue appears with `BufferedWriter`/`Writer`.

The solution is to add the `private` constructor:

        private Reader(Object fallbackLock, Void internal) {
                // assert fallbackLock != null;
                // use InternalLock for trusted classes
                Class<?> clazz = getClass();
                if (clazz == InputStreamReader.class
                        || clazz == BufferedReader.class
                        || clazz == FileReader.class
                        || clazz == sun.nio.cs.StreamDecoder.class) {
                        this.lock = InternalLock.newLockOr(fallbackLock);
                } else {
                        this.lock = fallbackLock;
                }
        }

to `Reader` (and an equivalent `private` constructor to `Writer`).

---

The `protected` `Reader` constructors can then be changed to:

        protected Reader() {
                this(this, null);
        }

and

        protected Reader(Object lock) {
                this(Objects.requireNonNull(lock), null);
        }


---

Doing so will allow this change to be reverted:
Suggestion:

        super(in);

-------------

PR: https://git.openjdk.java.net/jdk/pull/8166

Reply via email to