[英]Array of Objects to be used as Synchronization locks being garbage collected
希望我只是犯了一个新手错误,有人可以指出正确的方向,但是这里有:
我需要创建一个集合或数组,某种有组织的对象组(或任何其他有效的对象),以用作呈现方法的同步锁。 我一直将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]){
行synchronized(bmem.vertexbufferlocks[buf]){
NullPointerException on bmem.vertexbufferlocks[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]);
}}
我认为这里要解决的关键问题是,一旦循环结束,我的对象可能正在从数组中垃圾回收。
原来这是一个新手错误,在初始化锁数组之前我没有声明我的limit字段,但是我以前在声明我的单个锁的时候没有使用chunklimit(一个对象不需要它)。 因为我的初始化功能非常大,所以它对我有所影响。 谢谢您的回应! 感谢约翰·温特(John Vint)再次检查我的限额的动机。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.