17 Nisan 2019 Çarşamba

AtomicInteger Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.util.concurrent.atomic.AtomicInteger;
Kullanım amacı şöyle.
There are two main uses of AtomicInteger:
  1. As an atomic counter (incrementAndGet(), etc) that can be used by many threads concurrently
  2. As a primitive that supports compare-and-swap instruction (compareAndSet()) to implement non-blocking algorithms.
CAS Algoritması
Açıklaması şöyle.
The entire java.util.concurrent.atomic package in Java is based around the notion of compareAndSet(). This method uses machine-level locking to set a value only if the current value matches the expected precondition. The compareAndSet() method returns a Boolean, True if the "set" operation succeeded; or, False if the "set" operation failed the precondition. As such, this method can be executed inside a loop that will continuously try running the compareAndSet() operation until is succeeds.
constructor
Şöyle kullanırız
AtomicInteger  counter = new AtomicInteger(0);
compareAndSet metodu
İmzası şöyle. Parametreler currentValue, newValue olarak ta düşünülebilir. Nesnenin değeri ile currentValue aynı ise yani değişiklik yok ise yeni değer atanır. Bu işlem başarılı ise true döner. Başarısız ise false döner. Bu metodu genellikle döngü içinde kullanmak gerekir.
public final boolean compareAndSet(int expect, int update);
accumulateAndGet metodu - int x, IntBinaryOperator accumulatorFunction
Açıklaması şöyle
Atomically applies the specified accumulator function to the current value and the x value. Returns the updated value after the accumulation.
Örnek
Şöyle yaparız
// Define an accumulator function that multiplies the current value by the operand
IntBinaryOperator accumulator = (currentValue, operand) -> currentValue * operand;

// Using accumulateAndGet to multiply the current value by 3
int updatedValue = atomicInt.accumulateAndGet(3, accumulator);
System.out.println("Updated Value: " + updatedValue);

addAndGet metodu - int delta
Açıklaması şöyle
Atomically adds the specified delta to the current value and returns the updated value.
Örnek
Şöyle yaparız
AtomicInteger i = new AtomicInteger(8);
while ((i.addAndGet(-3)) > 0) ;
System.out.println("i = " + i.intValue());
decrementAndGet metodu
Açıklaması şöyle
Atomically decrements the current value by 1 and returns the updated value.
getAndAdd metodu
Açıklaması şöyle
Atomically decrements the current value by 1 and returns the previous value.
Değişkeni belirtilen değer kadar artırır ve eski değeri döner. Döngüyü kendi içinde kurar. Metodun içi şöyle
public final int getAndAddInt(Object var1, long var2, int var4) {
  int var5;
  do {
    var5 = this.getIntVolatile(var1, var2);
  } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

  return var5;
}
getAndAdd metodu - int delta
Açıklaması şöyle
Atomically adds the specified delta to the current value and returns the previous value.
getAndAccumulate metodu - int x + IntBinaryOperator accumulatorFunction
Açıklaması şöyle
Atomically applies the specified accumulator function to the current value and the x value. Returns the previous value before the accumulation.
Örnek
Şöyle yaparız
// Define an accumulator function that multiplies the current value by the operand
IntBinaryOperator accumulator = (currentValue, operand) -> currentValue * operand;

// Using getAndAccumulate to multiply the current value by 5
int previousValue = atomicInt.getAndAccumulate(5, accumulator);
System.out.println("Previous Value: " + previousValue);
System.out.println("Updated Value: " + atomicInt.get());

getAndDecrement metodu
Açıklaması şöyle
Atomically decrements the current value by 1 and returns the previous value.
getAndIncrement metodu
Açıklaması şöyle
Atomically increments the current value by 1 and returns the previous value.
Değişkeni artırır ve eski değeri döner. Döngüyü kendi içinde kurar. Metodun içi şöyle.
public final int getAndIncrement() {
  for (;;) {
    int current = get();
    int next = current + 1;
    if (compareAndSet(current, next))
      return current;
  }
 }
getAndAdd metodu
Değişkeni beliritlen değer kadar artırır ve eski değeri döner. Döngüyü kendi içinde kurar. Metodun içi şöyle
public final int getAndAddInt(Object var1, long var2, int var4) {
  int var5;
  do {
    var5 = this.getIntVolatile(var1, var2);
  } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

  return var5;
}
getAndSet metodu
Yeni değer atayıp eski değeri döner. Metodun için şöyle.
public final boolean getAndSet(boolean newValue) {
  for (;;) {
    boolean current = get();
    if (compareAndSet(current, newValue))
      return current;
  }
}
incrementAndGet metodu
Değişkeni artırır sonra yeni değeri döndürür. Açıklaması şöyle
Atomically increments the current value by 1 and returns the updated value.
Örnek
Şöyle yaparız.
counter.incrementAndGet() ;
set metodu
İmzası şöyle.
public final void set(int newValue);
updateAndGet metodu
İmzaları şöyle
int updateAndGet(IntUnaryOperator updateFunction)
int getAndUpdate(IntUnaryOperator updateFunction)
Örnek
[1- 59] arasında sayı için şöyle yaparız
AtomicInteger counter = new AtomicInteger();

public int getNextValue() {
    return counter.updateAndGet(n -> (n >= 60) ? 1 : n + 1);
}
Örnek
[1- 9] arasında sayı için şöyle yaparız
AtomicInteger counter = new AtomicInteger(0);

// to get & update
counter.getAndUpdate(value -> (value + 1) % 10)



Hiç yorum yok:

Yorum Gönder