在進行多線程時,我一直在尋找線程安全性。我正在研究使用鎖來使自定義數據結構線程安全。在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