一、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-tw/n/311475.html