1

我正在編寫一個多線程的平臺遊戲。一個線程執行繪畫工作,另一個線程運行遊戲邏輯。我有一個數組列表,兩個線程需要同時訪問。我在我的繪製線程遍歷數組列表中的所有元素,並且在我的另一個線程中,我有時會刪除或添加元素到數組列表中。我得到了一個併發修改異常,但我不明白爲什麼,因爲volatile關鍵字只允許一個線程一次訪問一個變量。揮發性arraylist不按預期行事

這裏是我的問題的一個例子

我的ArrayList

private volatile ArrayList<Entity> entities = new ArrayList<Entity>(); 

我的畫碼

for(Entity entity : entities) 
    { 
     if(entity!=null && entity.getX()>=xs-Block.WIDTH && entity.getX()<=xs+Main.WIDTH) 
      g.drawImage(entity.getImage(), entity.getX()-getXs(), entity.getY(), entity.getWidth(), entity.getHeight(), null); 
    } 

我刪除代碼

public void removeEntity(Entity e) 
{ 
    entities.remove(e); 
} 
+0

請張貼代碼,如果你已經嘗試了一些 – Abubakkar

回答

3

不,它不。 volatile關鍵字只保證您對所有線程都能看到任何聲明爲volatile的變量的修改。

例如,您需要正確同步您的代碼或使用CopyOnWriteArrayList

+0

謝謝CopyOnWriteArrayList工作 –

0

而不是使用volatile使用Collections.synchronizedList(list);

0

您可以使用已同步的矢量。

Vector

從Java 2平臺v1.2,這個類被改造爲 實現List接口,使它成爲Java的 Collections Framework的成員。與新的收集實現不同, 矢量是同步的。

+0

我以前嘗試過矢量它仍然拋出一個異常 –