如何在新线程中创建数组副本

时间:2014-01-24 13:31:02

标签: java arrays multithreading copy

我使用此方法创建数组的副本,但我怀疑,我打开线程并使用新线程发送数组,如果我不在新线程中创建此数组的副本,数组可能会更改,这会严重影响我的程序机制。

   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];
            }

        }
    }

这是正确的方法吗?

2 个答案:

答案 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,但是你需要更改很多代码。