在Java中,我有2个线程都访问(不修改)相同的BufferedImage。我只是将缓冲的图像绘制成一个单独的Graphics2D对象,其代码如下所示。
Graphics2D g = getGraphics();
g.drawImage(myImage, 0, 0, null);
我需要同步访问图像吗?
我知道AWTEventThread不是线程安全的等等。我只是在后台线程中构建一些BufferedImages。
非常感谢......
答案 0 :(得分:4)
(你问题的标题实际上并不符合正文中描述的情景,所以我假设你在询问这两种情况......)
刚刚访问(在那一点)不变的BufferedImage
的两个线程不需要在它们之间进行同步。
但是,确实需要在首先创建和初始化BufferedImage
对象的线程与随后读取它的任何线程之间存在先发生关系。如果没有该同步点,读取线程可能会看到图像数据结构部分的陈旧值。
答案 1 :(得分:2)
即使在另一个只读线程中,在EDT上进行的更改也必须变为可见,这需要一些形式的同步来创建happens-before关系。显示了几种替代方案here。