SonarCloud reports multiple incorrect double-checked locking cases in 
`sun.java2d.CRenderer`. For example:

  Arc2D arcToShape;

  ...
            if (arcToShape == null) {
                synchronized (this) {
                    if (arcToShape == null) {
                        arcToShape = new Arc2D.Float();
                    }
                }
            }

`Arc2D` contains fields that are not `final`. `arcToShape` is not `volatile`. 
This makes it an incorrect DCL.
This code is used by Mac OS, do it would probably blow up some time later on M1.

This is the candidate fix that preserves the semantics. I am doing this fix 
blindly so far, without testing on real Mac OS. But maybe there is no need to 
do any of this, because the setter methods overwrite the contents of all these 
objects under their own sync. So, maybe we can just allocate those objects 
without DCL-backed caching and pass them in?

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

Commit messages:
 - JDK-8263467: Incorrect double-checked locking in sun.java2d.CRenderer

Changes: https://git.openjdk.java.net/jdk/pull/2948/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=2948&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8263467
  Stats: 50 lines in 1 file changed: 15 ins; 0 del; 35 mod
  Patch: https://git.openjdk.java.net/jdk/pull/2948.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/2948/head:pull/2948

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

Reply via email to