我使用此方法创建数组的副本,但我怀疑,我打开线程并使用新线程发送数组,如果我不在新线程中创建此数组的副本,数组可能会更改,这会严重影响我的程序机制。
degersakla = new Integer[10000][1][boyut];
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
new GunlukKontrol(update, data, limit, degersakla, sincetime, untiltime);
}
});
t1.start();
try {
Thread.sleep(400000); // Waiting For new Thread's Copy Operation
} catch (InterruptedException ex) {
Logger.getLogger(UpdateDeneme.class.getName()).log(Level.SEVERE, null, ex);
}
// new Thread
public GunlukKontrol(Object[][][] update, String[][] data, Object[] limit, Integer[][][] degersakla, String sincetime, String untiltime) {
this.degersakla = new Integer[degersakla.length][1][boyut]; // copy method of array
for (int i = 0; i < degersakla.length; i++) {
for (int j = 0; j < 1; j++) {
for (int k = 0; k < boyut; k++) {
this.degersakla[i][j][k] = degersakla[i][j][k];
}
}
}
这是正确的方法吗?
答案 0 :(得分:1)
如果在启动第二个线程后更改了第一个线程中的数组,那么就会出现问题。
必须通过将数组的副本传递给第二个线程来解决此问题。如果让第二个线程复制数组,则无法避免阵列上的数据竞争。
答案 1 :(得分:0)
this.degersakla = Arrays.copyOf(degersakla, degersakla.length);
这将执行深层复制,速度非常快。
您的代码和 都是线程安全的。您需要实现锁定机制以确保:
final Object arrayLock = new Object();
//...
synchronized(arrayLock) {
myArray = Arrays.copyOf(myArray, myArray.length);
}
但是你需要在每次访问数组时调用synchronized :
synchronized(arrayLock) {
myArray[5] = 12;
}
如果这太复杂了,你可以使用concurrent class,但是你需要更改很多代码。