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

标签 java arrays multithreading

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

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

相关文章:

java - 抽象类的实现

javascript - 将Javascript数组解析为PHP问题

c# - 在 C# - C++/CLI - C++ Windows 窗体应用程序退出之前跟踪 - 并正确结束 - native 和托管线程

java - 除了 Scala 之外,在 JVM 上运行的替代多线程优化语言?

c++ - 使基于选择的循环尽可能响应

java - 有没有办法使用 selenium 和 java 从控制台设置启用保留日志来午餐 ChromeDriver?

java - 如何将 jUnit 5 与 Gradle 结合使用

java - 为什么我的输入中出现 NullPointerException?

javascript - 在没有太多嵌套循环的情况下在多维数组中查找匹配元素?

c++ - 指向数组子集的智能指针 (c++11)