Java 要用作被垃圾收集的同步锁的对象数组

Java 要用作被垃圾收集的同步锁的对象数组,java,arrays,multithreading,Java,Arrays,Multithreading,希望我只是犯了一个新手的错误,有人能给我指出正确的方向,但这里有: 我需要创建一个集合或数组,某种有组织的对象组(或任何其他有效的对象),用作渲染方法的同步锁。我一直将对象[]存储为字段,它似乎不喜欢存储数据。奇怪的是,当我将锁对象设置为类中的字段时,我没有遇到任何问题,但是如果我尝试使用下面这样的数组,它们在锁检查时将返回null 首先,我初始化锁数组: for(int i=0; i<limit*limit; i++) { vertexbufferlocks[i]=new Obj

希望我只是犯了一个新手的错误,有人能给我指出正确的方向,但这里有:

我需要创建一个集合或数组,某种有组织的对象组(或任何其他有效的对象),用作渲染方法的同步锁。我一直将对象[]存储为字段,它似乎不喜欢存储数据。奇怪的是,当我将锁对象设置为类中的字段时,我没有遇到任何问题,但是如果我尝试使用下面这样的数组,它们在锁检查时将返回null

首先,我初始化锁数组:

for(int i=0; i<limit*limit; i++) {
    vertexbufferlocks[i]=new Object();}
在整个程序初始化之后很久:

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

for(int buf=0;buf原来这是一个新手错误,我在初始化锁数组之前没有声明我的限制字段,但是我以前在声明我的单个锁时没有使用chunklimit(一个对象不需要它)。它从我身边溜走了,因为我的初始化函数非常大。不管怎样,感谢您的回复!感谢John Vint再次检查我的限制的动机。

原来这是一个新手的错误,我在初始化锁数组之前没有声明我的限制字段,但是我以前在初始化时没有使用chunklimite我声明了我的单个锁(一个对象不需要它)。它从我身边溜走了,因为我的初始化函数非常大。不管怎样,感谢您的响应!感谢John Vint再次检查我的限制。

您确定
bmem.vertexbufferlocks
与初始化的
vertexbufferlocks
是同一个数组吗?可能是在另一个对象或其他对象中?bmem的另一个实例?另外,使用
vertexbufferlocks.length
而不是
limit*limit
,是一种更好的模式。您是否验证了
bmem
不是空的?该行有两个地方可以使指针空。多使用一点代码会有帮助。它肯定是我指向的正确数组。length在适用于我的模型的其余部分,但您通常是对的。Bmem绝对不是null,因为在我的代码的其余部分中,调用的方法是在Bmem构造函数之后调用的。如果这有助于大家思考的话,我的程序在使用单个对象作为锁(作为Bmem字段)的情况下运行良好,而不是根据数据段从对象数组中进行选择。我尝试的是为我的每个数据段设置一个锁,这样我就不必在任何常规数据管理期间冻结渲染。您是否可以声明limit final并查看这是否有任何区别?除了创建不同的vertexbufferlock,GC应该除非是弱/软引用,否则不要进入并回收数组中的元素。唯一的替代解释是,在数组上的线程同步发生在数组完全初始化之前。您确定
bmem.vertexbufferlocks
与已初始化的
vertexbufferlocks
是同一个数组吗?可能是这是在另一个对象或其他东西中?bmem的另一个实例?同样,使用
vertexbufferlocks.length
而不是
limit*limit
是一种更好的模式。您是否验证了
bmem
不是空的?该行有两个地方可以使指针为空。您的代码再多一点会有所帮助。它肯定是r我指的是ight数组。长度与我模型的其余部分不一致,但你通常是对的。Bmem绝对不为null,因为在我代码的其余部分中,调用的方法是在Bmem构造函数之后调用的。如果这有助于大家思考,我的程序在使用单个对象作为锁(作为Bmem字段)时运行良好,而不是根据数据段从对象数组中进行选择。我尝试的是为我的每个数据段设置一个锁,这样我就不必在任何常规数据管理期间冻结渲染。您是否可以声明limit final并查看这是否有任何区别?除了创建不同的vertexbufferlock,GC应该除非是弱/软引用,否则不要进入并回收数组中的元素。唯一的替代解释是,在数组完全初始化之前,会发生数组上的线程同步。
    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]);
}}