Java Concurrency - Kelas AtomicInteger

Kelas java.util.concurrent.atomic.AtomicInteger menyediakan operasi pada nilai int yang mendasari yang dapat dibaca dan ditulis secara atomik, dan juga berisi operasi atom tingkat lanjut. AtomicInteger mendukung operasi atom pada variabel int yang mendasari. Ini telah mendapatkan dan menetapkan metode yang berfungsi seperti membaca dan menulis pada variabel volatil. Artinya, himpunan memiliki hubungan terjadi-sebelum dengan get berikutnya pada variabel yang sama. Metode atomic CompareAndSet juga memiliki fitur konsistensi memori ini.

Metode AtomicInteger

Berikut adalah daftar metode penting yang tersedia di kelas AtomicInteger.

Sr.No. Metode & Deskripsi
1

public int addAndGet(int delta)

Secara atomis menambahkan nilai yang diberikan ke nilai saat ini.

2

public boolean compareAndSet(int expect, int update)

Secara atomis menetapkan nilai ke nilai yang diperbarui jika nilai saat ini sama dengan nilai yang diharapkan.

3

public int decrementAndGet()

Secara atomik mengurangi satu nilai saat ini.

4

public double doubleValue()

Mengembalikan nilai dari angka yang ditentukan sebagai ganda.

5

public float floatValue()

Mengembalikan nilai dari angka yang ditentukan sebagai float.

6

public int get()

Mendapat nilai saat ini.

7

public int getAndAdd(int delta)

Secara atomiclly menambahkan nilai yang diberikan ke nilai saat ini.

8

public int getAndDecrement()

Secara atomik mengurangi satu nilai saat ini.

9

public int getAndIncrement()

Secara atomis bertambah satu nilai saat ini.

10

public int getAndSet(int newValue)

Secara atomis disetel ke nilai yang diberikan dan mengembalikan nilai lama.

11

public int incrementAndGet()

Secara atomis bertambah satu nilai saat ini.

12

public int intValue()

Mengembalikan nilai dari angka yang ditentukan sebagai int.

13

public void lazySet(int newValue)

Akhirnya disetel ke nilai yang diberikan.

14

public long longValue()

Mengembalikan nilai dari angka yang ditentukan sebagai panjang.

15

public void set(int newValue)

Set ke nilai yang diberikan.

16

public String toString()

Mengembalikan representasi String dari nilai saat ini.

17

public boolean weakCompareAndSet(int expect, int update)

Secara atomis menetapkan nilai ke nilai yang diperbarui jika nilai saat ini sama dengan nilai yang diharapkan.

Contoh

Program TestThread berikut menunjukkan implementasi penghitung yang tidak aman di lingkungan berbasis thread.

public class TestThread {

   static class Counter {
      private int c = 0;

      public void increment() {
         c++;
      }

      public int value() {
         return c;
      }
   }
   
   public static void main(final String[] arguments) throws InterruptedException {
      final Counter counter = new Counter();
      
      //1000 threads
      for(int i = 0; i < 1000 ; i++) {
         
         new Thread(new Runnable() {
            
            public void run() {
               counter.increment();
            }
         }).start(); 
      }  
      Thread.sleep(6000);
      System.out.println("Final number (should be 1000): " + counter.value());
   }  
}

Ini dapat menghasilkan hasil sebagai berikut tergantung pada kecepatan komputer dan jalinan benang.

Keluaran

Final number (should be 1000): 1000

Contoh

Program TestThread berikut menunjukkan implementasi penghitung yang aman menggunakan AtomicInteger di lingkungan berbasis utas.

import java.util.concurrent.atomic.AtomicInteger;

public class TestThread {

   static class Counter {
      private AtomicInteger c = new AtomicInteger(0);

      public void increment() {
         c.getAndIncrement();
      }

      public int value() {
         return c.get();
      }
   }
   
   public static void main(final String[] arguments) throws InterruptedException {
      final Counter counter = new Counter();
      
      //1000 threads
      for(int i = 0; i < 1000 ; i++) {

         new Thread(new Runnable() {
            public void run() {
               counter.increment();
            }
         }).start(); 
      }  
      Thread.sleep(6000);
      System.out.println("Final number (should be 1000): " + counter.value());
   }
}

Ini akan menghasilkan hasil sebagai berikut.

Keluaran

Final number (should be 1000): 1000