Java Concurrency - คลาส AtomicLong

คลาส java.util.concurrent.atomic AtomicLong จัดเตรียมการดำเนินการกับค่ายาวพื้นฐานที่สามารถอ่านและเขียนแบบอะตอมได้และยังมีการดำเนินการของอะตอมขั้นสูง AtomicLong สนับสนุนการดำเนินการของอะตอมกับตัวแปรยาวที่อยู่ภายใต้ มันมีวิธีการรับและตั้งค่าที่ทำงานเหมือนอ่านและเขียนบนตัวแปรระเหย นั่นคือชุดมีความสัมพันธ์ที่เกิดขึ้นก่อนกับการรับตัวแปรเดียวกันในภายหลัง วิธี atomic CompareAndSet ยังมีคุณสมบัติความสอดคล้องของหน่วยความจำเหล่านี้

วิธีการ AtomicLong

ต่อไปนี้เป็นรายการวิธีการสำคัญที่มีอยู่ในคลาส AtomicLong

ซีเนียร์ วิธีการและคำอธิบาย
1

public long addAndGet(long delta)

เพิ่มค่าที่กำหนดให้กับค่าปัจจุบันในเชิงอะตอม

2

public boolean compareAndSet(long expect, long update)

ตั้งค่าแบบอะตอมเป็นค่าอัพเดตที่กำหนดหากค่าปัจจุบันตรงกับค่าที่คาดไว้

3

public long decrementAndGet()

ลดลงทีละค่าตามค่าปัจจุบัน

4

public double doubleValue()

ส่งคืนค่าของตัวเลขที่ระบุเป็นค่าคู่

5

public float floatValue()

ส่งคืนค่าของตัวเลขที่ระบุเป็นค่าลอย

6

public long get()

รับค่าปัจจุบัน

7

public long getAndAdd(long delta)

Atomiclly เพิ่มค่าที่กำหนดให้กับค่าปัจจุบัน

8

public long getAndDecrement()

ลดลงทีละค่าตามค่าปัจจุบัน

9

public long getAndIncrement()

เพิ่มขึ้นทีละหนึ่งค่าปัจจุบัน

10

public long getAndSet(long newValue)

ตั้งค่าเป็นค่าที่กำหนดโดยอะตอมและส่งกลับค่าเก่า

11

public long incrementAndGet()

เพิ่มขึ้นทีละหนึ่งค่าปัจจุบัน

12

public int intValue()

ส่งกลับค่าของตัวเลขที่ระบุเป็น int

13

public void lazySet(long newValue)

ในที่สุดก็ตั้งค่าเป็นค่าที่กำหนด

14

public long longValue()

ส่งคืนค่าของตัวเลขที่ระบุเป็น long

15

public void set(long newValue)

ตั้งค่าเป็นค่าที่กำหนด

16

public String toString()

ส่งกลับการแสดงสตริงของค่าปัจจุบัน

17

public boolean weakCompareAndSet(long expect, long update)

ตั้งค่าแบบอะตอมเป็นค่าอัพเดตที่กำหนดหากค่าปัจจุบันตรงกับค่าที่คาดไว้

ตัวอย่าง

โปรแกรม TestThread ต่อไปนี้แสดงการใช้งานตัวนับอย่างปลอดภัยโดยใช้ AtomicLong ในสภาพแวดล้อมแบบเธรด

import java.util.concurrent.atomic.AtomicLong;

public class TestThread {

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

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

      public long 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());
   }
}

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้

เอาต์พุต

Final number (should be 1000): 1000