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