gpt4 book ai didi

java - 在java中使自定义数据结构线程安全?

转载 作者:行者123 更新时间:2023-12-01 20:10:51 24 4
gpt4 key购买 nike

我在进行多线程处理时一直在研究线程安全。我正在研究使用锁来使自定义数据结构线程安全。

这是使此自定义直方图线程安全的最合适的实现吗?

我也是新来的。如果我想帮助跟踪代码以找出它的作用,是否可以使用一个标签?

直方图类(不安全)

public class Histogram
{
protected long[] bins;
protected int min, max, range;
protected int numBins;

public Histogram(int max, int min, int numBins)
{
this.max = max;
this.min = min;
this.numBins = numBins;
bins = new long[numBins];
range = max - min + 1;
}

public void add(int num)
{
int bin = (int) Math.floor(((num - min) * 1.0 / range) * numBins);
bins[bin]++;
}

public int absDifference(Histogram histogram)
{
int sum = 0;
if (histogram.min == min && histogram.max == max && histogram.numBins == numBins)
for (int i = 0; i < bins.length; i++)
sum += (int) Math.abs(bins[i] - histogram.bins[i]);

return sum;
}

@Override
public String toString()
{
String out = String.format("{Min: %d, Max: %d, # Bins: %d, Values: ", min, max, numBins);
for (int i = 0; i < bins.length; i++)
out += bins[i] + ", ";

out = out.substring(0, out.length() - 2);
out += "}";
return out;
}
}

线程安全直方图类

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class HistogramSafe extends Histogram
{
private Lock[] binLocks;

public HistogramSafe(int max, int min, int numBins)
{
super(max, min, numBins);

binLocks = new ReentrantLock[numBins];
for (int i = 0; i < numBins; i++)
binLocks[i] = new ReentrantLock();
}

@Override
public void add(int num)
{
int bin = (int) Math.floor(((num - min) * 1.0 / range) * numBins);

binLocks[bin].lock();
bins[bin]++;
binLocks[bin].unlock();
}
}

最佳答案

这要看情况。如果您的 numBins(还有 minmax)变量无法更改,即您的数据结构为固定大小,那么它应该是线程安全,允许并行修改不同的bin。

<小时/>

但是如果numBins(或minmax)是可修改的,那么它就不再是线程安全的了。正如您之前访问的 numBins 一样,它也是共享资源,并且不在同一个锁内。

线程可能会进入该方法,读取numBins,然后 hibernate (由于线程调度程序)。现在另一个线程来并执行完整的方法。旧线程继续并设置 bins[bin]++,但 numBins 使用过时的值

例如,如果您还提供 remove 函数,那么这甚至可能导致 IndexOutOfBoundException,因为第一个线程可能读取 10< 的大小 然后其他线程将大小减小到 5。当第一个线程继续时,它可能会尝试写入无效索引

关于java - 在java中使自定义数据结构线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46728986/

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