gpt4 book ai didi

Java - 同步原始数组中的各个元素

转载 作者:行者123 更新时间:2023-11-30 03:48:16 25 4
gpt4 key购买 nike

所以我有一个包含很多整数的数组,并且我在各处写入单个位以存储信息。就像这样:

public class myclass
{
int[] bitArray;

//methods

public myclass()
{
bitArray = new int[200000000]; //200 million ints
}

public void flagBit(int arrayIndex, bitIndex)
{
/** 10000000 00000000 00000000 00000000 >>> bitIndex */
bitArray[arrayIndex] |= (0x80000000 >>> bitIndex);
}
}

现在,正如您所看到的,这是大量数据。所以效率势在必行。

无论如何,我希望多个线程同时(安全地)将数据写入该数组。不幸的是,在 Java 中,您无法执行以下操作:

public void flagBit(int arrayIndex, bitIndex)
{
/** 10000000 00000000 00000000 00000000 >>> bitIndex */

synchronized (bitArray[arrayIndex]) //wrong!!! must synchronize to object!
{
bitArray[arrayIndex] |= (0x80000000 >>> bitIndex);
}
}

所以,我想知道最有效或最好的方法是什么?我知道 AtomicIntegerArray,但我相信我可以比那更高效。我尝试提出一个解决方案,这就是我得到的(不过我还没有测试过,它有效吗?)

public class myclass
{
int[] bitArray;
SYNC[] indexSync;

//inner class(es)

private static final class SYNC
{
private static final boolean sync = false;
}

//methods

public myclass()
{
bitArray = new int[200000000]; //200 million ints

indexSync = new SYNC[bitArray.length];
}

public void flagBit(int arrayIndex, bitIndex)
{
/** 10000000 00000000 00000000 00000000 >>> bitIndex */

synchronized (indexSync[arrayIndex])
{
bitArray[arrayIndex] |= (0x80000000 >>> bitIndex);
}
}
}

那么,有没有比我发布的方式更有效的方法呢?我发布的方式还有效吗?我的方法会非常有效吗?谢谢~

最佳答案

您可能应该只使用 AtomicIntegerArray。看起来它完全满足您的需要,并且是由专家编写的经过良好测试的代码。在打折之前你应该测试它的性能。

如果你真的不想使用AtomicIntegerArray,你真的不需要SYNC类,你可以只使用 boolean 对象。另外,如果您要创建完整的第二个 SYNC 对象数组,则将第一个数组创建为整数而不是整数可能是值得的。

关于Java - 同步原始数组中的各个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25070375/

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