但願我只是做一個新手的錯誤,有人可以點我在正確的方向,但在這裏,同步鎖被垃圾老話:對象數組用作收集
我需要創建一個收集或陣列,某種有組織的對象組(或任何其他可用的)用作呈現方法的同步鎖。我一直在存儲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]);
}}
我認爲這裏要解決的關鍵問題是,一旦循環結束,我的對象可能會從我的數組中被垃圾回收。
您確定'bmem.vertexbufferlocks'與初始化的'vertexbufferlocks'是同一個數組嗎?也許這是另一個物體或其他東西? bmem的另一個例子? – Gray 2012-02-22 14:38:57
此外,使用'vertexbufferlocks.length'而不是'limit * limit'是一種更好的模式。 – Gray 2012-02-22 14:40:38
你是否證實'bmem'不是null?該行有兩個地方可以爲空指針。多一點你的代碼會有幫助。 – 2012-02-22 14:40:52