2014-01-24 4 views
0

이 메서드를 사용하여 배열 복사본을 만들지 만 의심 스럽지만 스레드를 열고 새 스레드로 배열을 보냈습니다.이 배열의 복사본을 새 스레드, 배열 변경 될 수 있으며 이로 인해 프로그램 메커니즘에 악영향을 미칩니다.새 스레드에서 배열 복사본을 어떻게 만듭니 까?

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

배열 배열 배열? 확실해? – Eugene

답변

1

이 두 번째 스레드 인으로 시작된 후 첫 번째 스레드에서 배열을 변경하면 문제가 발생합니다.

배열의 사본을 두 번째 스레드로 전달하여 문제를 해결해야합니다. 두 번째 스레드가 배열을 복사하게하면 어레이에서 데이터 경쟁을 피할 수 없습니다.

0
this.degersakla = Arrays.copyOf(degersakla, degersakla.length); 

이것은 딥 - 복사본을 수행 할 것이고 매우 빠릅니다.

코드와이 코드는 모두 이 아니며은 thread-safe입니다.

final Object arrayLock = new Object(); 
//... 
synchronized(arrayLock) { 
    myArray = Arrays.copyOf(myArray, myArray.length); 
} 

은 그러나 당신이 배열에 액세스 마다 동기화 호출해야합니다 : 당신은 수 있도록 잠금 메커니즘을 구현해야하는이 너무 복잡하면

synchronized(arrayLock) { 
    myArray[5] = 12; 
} 

을, 당신은을 사용할 수 있습니다 concurrent class하지만 많은 코드를 변경해야합니다.

관련 문제