2012-02-22 47 views
1

但願我只是做一個新手的錯誤,有人可以點我在正確的方向,但在這裏,同步鎖被垃圾老話:對象數組用作收集

我需要創建一個收集或陣列,某種有組織的對象組(或任何其他可用的)用作呈現方法的同步鎖。我一直在存儲Object []作爲一個字段,它似乎不喜歡存儲數據。奇怪的是,當我在我的類中將鎖對象設置爲字段時,我沒有問題,但是如果我嘗試使用下面的數組,它們將在鎖檢查時返回null。

首先我初始化我鎖陣:

for(int i=0; i<limit*limit; i++) { 
    vertexbufferlocks[i]=new Object();} 

然後,我打電話給我的渲染功能:

for(int buf=0; buf<limit*limit; buf++){ 
    synchronized(bmem.vertexbufferlocks[buf]){ 
     bindbuffer(vbids[buf]); 
     GL11.glDrawArrays(GL11.GL_QUADS, 0, drawlengths[buf]); 
}} 

會拋出:NullPointerException on bmem.vertexbufferlocks[buf]上線synchronized(bmem.vertexbufferlocks[buf]){我肯定先運行構造循環。我也試過使用LinkedList,List和HashMap,也是同樣的問題。我只有使用這種特定類型的問題,我有其他同步類用於數據,初始化和讀取在同一時間,這是不受影響。

新的細節:

優良樣板工程,對我來說會導致非常小的視覺提高警惕,因爲我不能提供任何數據,而其他數據被修改,所有的呼叫都在相同的位置前:

初始化:

vertexbufferlock=new Object(); 

很久以後整個程序初始化後:

for(int buf=0; buf<limit*limit; buf++){ 
    synchronized(bmem.vertexbufferlock){ 
     bindbuffer(vbids[buf]); 
     GL11.glDrawArrays(GL11.GL_QUADS, 0, drawlengths[buf]); 
}} 

我認爲這裏要解決的關鍵問題是,一旦循環結束,我的對象可能會從我的數組中被垃圾回收。

+1

您確定'bmem.vertexbufferlocks'與初始化的'vertexbufferlocks'是同一個數組嗎?也許這是另一個物體或其他東西? bmem的另一個例子? – Gray 2012-02-22 14:38:57

+2

此外,使用'vertexbufferlocks.length'而不是'limit * limit'是一種更好的模式。 – Gray 2012-02-22 14:40:38

+2

你是否證實'bmem'不是null?該行有兩個地方可以爲空指針。多一點你的代碼會有幫助。 – 2012-02-22 14:40:52

回答

1

原來,這是一個新手的錯誤,我沒有在初始化鎖定數組之前聲明我的限制字段,但是我以前沒有使用chunklimit在我聲明我的單一鎖的位置(不需要它一個對象)。它因我的初始化函數非常大而滑落。無論如何謝謝你的迴應!感謝John Vint的動機來重新檢查我的極限。