RFR: 8355078: java.awt.Color.createContext() uses unnecessary synchronization [v2]

Sergey Bylokhov serb at openjdk.org
Sun May 18 22:59:36 UTC 2025


> At some point, java.awt.Color.createContext() was marked as synchronized to support caching of a ColorPaintContext instance. The cache was later removed, but the synchronized modifier remained. Since there is no shared mutable state anymore, the synchronization is no longer necessary and can be safely removed.
> 
> 
> Note: This code path is rarely executed because a special optimization was introduced in [SunGraphics2D.setPaint](https://github.com/openjdk/jdk/blob/c514f135ccf08c3be016a32ae8f2c055fb941857/src/java.desktop/share/classes/sun/java2d/SunGraphics2D.java#L1003). As a result, unless a custom wrapper around the Color class is used, the Color.createContext() method is typically bypassed during rendering. 
> 
> Two tests are added:
>  - ColorPaintContextBasicTest: Checks if different image types (BufferedImage and VolatileImage) produce the same results when using different ways to fill the image (setColor, setPaint, and custom Paint). This test intentionally uses a custom Paint implementation to bypass the optimization and ensure that Color.createContext() is invoked verifying its correct behavior.
> - ColorPaintContextStateTrackerTest: Checks that the raster used in ColorPaintContext.getRaster() can be properly cached in video memory and we do not need to call icr.markDirty() in ColorPaintContext.getRaster()

Sergey Bylokhov has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains six additional commits since the last revision:

 - Merge branch 'openjdk:master' into colorctx
 - Merge branch 'openjdk:master' into colorctx
 - Update ColorPaintContextBasicTest.java
 - handle VolatileImage properly
 - Update ColorPaintContext.java
 - 8355078: java.awt.Color.createContext() uses unnecessary synchronization

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/24771/files
  - new: https://git.openjdk.org/jdk/pull/24771/files/30008b2c..72876482

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=24771&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=24771&range=00-01

  Stats: 51757 lines in 1566 files changed: 25015 ins; 18534 del; 8208 mod
  Patch: https://git.openjdk.org/jdk/pull/24771.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/24771/head:pull/24771

PR: https://git.openjdk.org/jdk/pull/24771


More information about the client-libs-dev mailing list