在进行多线程时,我一直在寻找线程安全性。我正在研究使用锁来使自定义数据结构线程安全。在java中自定义数据结构线程安全吗?
这是用于制作此自定义直方图线程安全的最合适的实现吗?
另外我是新来的。如果我想要帮助跟踪代码以找出它的作用,是否有我可以使用的标签?
直方图类(不安全)
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();
}
}
如果用户回答您的问题,请接受他的回答([接受答案:它是如何工作的?](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-工作))。如果不是,那么请说明还没有答案,这是StackOverflow的重要组成部分,非常感谢。 – Zabuza