一、AtomicInteger簡介
在多線程編程中,當多個線程同時訪問同一個變量時,如果不加以限制,就會存在競爭條件,導致變量值不確定。為了解決這個問題,Java提供了一組原子類(Atomic class),其中一種就是AtomicInteger。
AtomicInteger是一個用於帶符號整型數值(int)的原子類。它能夠在不使用鎖的情況下保證整型變量的原子性操作。AtomicInteger定義了一些原子操作方法,通過這些方法能夠實現變量的原子操作,如addAndGet、compareAndSet、decrementAndGet、getAndAdd等,從而能夠實現線程安全。
二、AtomicInteger與線程安全
使用AtomicInteger能夠保證多線程同時對變量進行的操作是原子的。原子操作是指一組操作不會被其他線程中斷,保證整個操作一定能夠得到完成。這種機制是基於CAS(Compare And Swap)實現的。
在AtomicInteger中,CAS操作是通過compareAndSet方法實現的。當多個線程同時調用compareAndSet方法,只有一個線程能夠修改變量。如果同時有多個線程調用該方法,會有一個線程成功修改變量,其他線程將返回false,隨後再進行重試。因此,使用AtomicInteger能夠避免競爭條件,實現線程安全。
三、AtomicInteger的常用方法
1、get方法:獲取當前AtomicInteger的值。
AtomicInteger count = new AtomicInteger(0);
int currentCount = count.get();
2、addAndGet方法:將指定值與當前的AtomicInteger的值相加,並返回新的值。
AtomicInteger count = new AtomicInteger(0);
int result = count.addAndGet(2);
3、compareAndSet方法:比較當前值是否等於expect的值,如果相等則將當前值設置為update,並返回true,否則返回false。
AtomicInteger count = new AtomicInteger(0);
boolean flag = count.compareAndSet(0, 2);
4、decrementAndGet方法:將當前值減1,並返回新的值。
AtomicInteger count = new AtomicInteger(2);
int result = count.decrementAndGet();
5、getAndAdd方法:先獲取當前AtomicInteger的值,再將指定值與當前值相加,並返回原來的值。
AtomicInteger count = new AtomicInteger(0);
int result = count.getAndAdd(2);
四、AtomicInteger的使用場景
1、在計數器中使用:通過AtomicInteger能夠實現多線程對計數器的安全操作,避免競爭條件。
AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
public int getCount() {
return counter.get();
}
2、在保證線程安全的數據結構中使用:比如Stack、Queue等數據結構,通過使用AtomicInteger能夠保證多線程操作這些數據結構的時候不會出現競爭條件。
Queue<String> queue = new ConcurrentLinkedQueue<>();
AtomicInteger count = new AtomicInteger(0);
public void enqueue(String item) {
queue.offer(item);
count.incrementAndGet();
}
public String dequeue() {
String item = queue.poll();
if (item != null) {
count.decrementAndGet();
}
return item;
}
public int getCount() {
return count.get();
}
3、在某些需要高效的算法中使用:原子類的操作比鎖操作的性能更好,所以在某些需要高效的算法中,可以選擇使用原子類。
五、小結
Java中的AtomicInteger是一個用於帶符號整型數值的原子類,能夠在不使用鎖的情況下保證原子性操作,從而實現線程安全。適用於計數器、保證線程安全的數據結構和高效算法等場景。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/311475.html
微信掃一掃
支付寶掃一掃