gpt4 book ai didi

java - 用作垃圾收集的同步锁的对象数组

转载 作者:太空宇宙 更新时间:2023-11-04 08:21:50 24 4
gpt4 key购买 nike

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

我需要创建一个集合或数组,某种有组织的对象组(或任何其他有效的东西),以用作渲染方法的同步锁。我一直将一个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]);
}}

这会抛出: synchronized(bmem.vertexbufferlocks[buf]){ 行上的 NullPointerException on 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]);
}}

我认为这里要解决的关键问题是,一旦循环结束,我的对象可能会被垃圾收集出我的数组。

最佳答案

事实证明这是一个新手错误,我在初始化锁数组之前没有声明我的限制字段,但是我之前在声明我的单个锁时没有使用 chunklimit (对于一个对象不需要它)。它被我忽略了,因为我的初始化函数非常大。不管怎样感谢您的回复!感谢 John Vint 给予我仔细检查限额的动力。

关于java - 用作垃圾收集的同步锁的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9396837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com