Является ли Graphics2D потокобезопасным?

Я хотел бы улучшить производительность отрисовки моего кода на экземпляре java.awt.Graphics2D, который я получил от BufferedImage. (Свинг и UI вообще не на картинке). Я изо всех сил пытаюсь найти четкий ответ, является ли экземпляр Graphics2D потокобезопасным или нет, т.е. Могу ли я установить N разных потоков, рисующих один и тот же экземпляр, или нет?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
331
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что ж, Graphics2D и Graphics - это абстрактные классы без какого-либо состояния, поэтому теоретически они мощь являются потокобезопасными, но это будет зависеть от фактической реализации/подкласса, который вы получите.

Однако, если ваш код рисования может привести к перекрытию, обработка нескольких потоков может стать довольно сложной (если вы можете упорядочить фигуры и нет прозрачности, вы мощь сможете использовать некоторую z-буферизацию). Таким образом, я бы не стал заморачиваться с многопоточным рендерингом на одном и том же холсте (графическом объекте), что сделало бы вопрос спорным.

Вместо этого я бы предложил разделить рендеринг на несколько отдельных задач и объединить результаты в конце.

В зависимости от того, что вы на самом деле визуализируете, я могу представить 2 основных подхода:

  • разделить рендеринг на несколько плиток и объединить их в конце
  • если вы визуализируете сложные формы, создание которых обходится дорого, затем визуализируйте их в промежуточные изображения, а затем объедините их одним потоком, просто визуализируя эти промежуточные изображения на окончательном холсте (для этого может потребоваться упорядочивание промежуточных шагов)

Другие вопросы по теме