2011-06-11 119 views
4

在Java中,我有2个线程都访问(不修改)相同的BufferedImage。我只是用这样的代码将缓冲图像绘制到独立的Graphics2D对象中。正在访问BufferedImage线程安全

Graphics2D g = getGraphics(); 
g.drawImage(myImage, 0, 0, null); 

是否有任何理由需要同步访问图像?

我知道AWTEventThread不是线程安全的等我只是在后台线程中构建一些BufferedImages。

谢谢了...

+0

为了澄清,在任一线程访问缓冲图像之前创建缓冲图像。他们都只是访问一个不变的缓冲图像。我问的原因是因为BufferedImage不是一个可变对象。 g.drawImage可能会修改它。我认为它不是 – awinbra 2011-06-11 18:49:49

回答

4

(你的问题实际上并不匹配在身体描述的场景的标题,所以我假设你是问关于这两种情况下...)

两个线程都只是一个访问(此时)不变的BufferedImage不需要在它们自己之间同步。

但是,确实需要在首先创建并初始化对象的线程与随后读取该线程的任何线程之间发生先发生关系。没有那个同步点,读线程可能会看到图像数据结构的部分陈旧值。

+1

从提出问题的方式来看,这似乎不成问题(例如,他在启动线程之前创建映像) - 在这种情况下,如果在构造函数中分配变量,则不会甚至必须使myImage变得不稳定。 – Voo 2011-06-11 02:28:56

+1

@Voo - 就我所知,没有足够的信息来说明线程何时启动,以及这是否足以提供事前关系。 – 2011-06-11 02:41:14

+1

也许我读的太多了 - 但是如果他在创建线程之前没有创建图片,那么他至少需要一个if(img!= null)和通常的场景,像这样也可以确保它。但是,我确信我认为这是可能的。 – Voo 2011-06-11 16:38:12

2

即使在另一个只读线程,在美国东部时间所做的更改必须成为可见,这需要一些形式同步创建happens-before关系。显示了几种替代方案here