我有一个多线程模型。当一个线程抛出一些事件时,我们需要在VolatileImage上绘制一些东西。这是一些代码:
private VolatileImage image;
private void buff() {
image = createVolatileImage(200, 200, Transparency.OPAQUE);
}
public void paintCircle(int x, int y, int h, int w) {
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.fillOval(x, y, h, w);
}
这个方法(paintCircle)可以在没有synchronized关键字的情况下给我带来麻烦吗?
答案 0 :(得分:2)
Java内存模型使用先发生关系来描述从线程上的更改何时在另一个中可见。如果在一个线程中调用buff,然后在AWT事件调度线程中绘制,则buff的更改可能不会传播到EDT,因此您应该强制执行此关系。一种方法是使用synchronized关键字或使图像字段不稳定。