2016-04-14 13 views
0

konusundaki konuları kullanıyorum 4 thread'ın bir histogram oluşturmasına izin vermek için kod yazıyorum.Atomic Integer Array

Ben ana bir dizi var:

int N = 10000; 
Random r = new Random(); 
int[] a = new int[N]; 

for (int i = 0; i < a.length; i++) 
{ 
    a[i] = Math.abs(r.nextInt() % 100); 
} 

Böylece temelde ne yapmak istediğinizi bu dizi boyunca döngüsünü ve her sayı kaç kere göründüğü sayılır.

Konu sınıfım yazdım ve aynı dizine aynı anda erişmeye çalışan birden fazla iş parçacığı sorununun çözülmesine yardımcı olacağını düşündüğüm AtomicInteger kullandım.

import java.util.concurrent.atomic.AtomicInteger; 

public class UseThread implements Runnable 
{ 
private static int[] array; 
private static AtomicInteger[] count; 
private static boolean[] check; 

public UseThread(int[] array, AtomicInteger[] count) 
{ 
    this.array = array; 
    this.count = count; 
    this.check = new boolean[array.length]; 
} 

public void run() 
{ 
    for (int i = 0; i < array.length; i++) 
    { 
     if (!getIndex(this.check[i])) 
     { 
      this.check[i] = true; 
      int number = array[i]; 
      count[number].incrementAndGet(); 
     } 
    } 
} 

public synchronized static boolean getIndex(boolean check2) 
{ 
    return check2; 
} 

Ancak, bu benim sorunumu tam olarak düzeltmedi. Konuların bazıları diziye aynı anda erişiyor, count dizisini yapıyor, array dizisinin uzunluğundan daha büyük bir değer tutuyor.

Sorunun, boole denetim dizisinde olduğunu düşünüyorum. Birden çok iş parçacığının aynı boole dizisi dizinine aynı anda eriştiğini hissediyorum.

Belki de basit bir düzeltme olduğunu düşünüyorum, ancak göremiyorum.

Herhangi bir öneri?

AtomicBoolean dizisini denedim, ancak yardımcı olmadı. Aşağıda aynı sınıf ama uygulanan AtomicBoolean dizisi var.

import java.util.concurrent.atomic.AtomicBoolean; 
import java.util.concurrent.atomic.AtomicInteger; 

public class Assign7Q3 implements Runnable 
{ 
private static int[] array; 
private static AtomicInteger[] count; 
private static AtomicBoolean[] check; 

public Assign7Q3(int[] array, AtomicInteger[] count) 
{ 
    this.array = array; 
    this.count = count; 
    this.check = new AtomicBoolean[array.length]; 
    for(int i = 0; i < check.length; i ++) 
     check[i] = new AtomicBoolean(false); 
} 

public void run() 
{ 
    for (int i = 0; i < array.length; i++) 
    { 
     //System.out.println(this.check[i].get()); 
     if (!getIndex(this.check[i])) 
     { 
      this.check[i].set(true); 
      int number = array[i]; 
      count[number].incrementAndGet(); 
     } 
    } 
} 

public synchronized static boolean getIndex(AtomicBoolean check2) 
{ 
    return check2.get(); 
} 
+1

Sorun * açıklamayı ister misiniz? –

+0

Sanırım sorun kontrolün “boolean” kontrol dizisinde. Birden çok iş parçacığının aynı "boolean" denetim dizisi dizinine aynı anda eriştiğini hissediyorum. @YassinHajaj –

+0

Doğru. Onu 'AtomicBoolean' olarak değiştirin, evet? –

cevap

2

Sen Birlikte kullanılamayan olmak için if ifadesi için compareAndSet kullanmak gerekir:

if (this.check[i].compareAndSet(false, true)) 
{ 
    int number = array[i]; 
    count[number].incrementAndGet(); 
} 

Bu kontroller hem de atomik değerini ayarlar.

compareAndSet olmadan, iki iş parçacığının değeri kontrol edebileceği ve set(true) numaralı telefonu arayabilmesi için if bloğunu aynı anda girebilme olasılığı vardır.

+0

'un kullanımını kapsamıyor. Çok teşekkür ederim, bunu farketmedim. Çok takdir –