2011-06-11 53 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