大家在工作中肯定遇到過計數統計需求,單執行緒的情況下count直接定義int型就行,可是在多執行緒併發下會產生多個執行緒同時count++的情況,那麼這種情況就需要用到atomicinteger來保證int型變數操作的原子性。
atomicinteger要點闡述
atomicinteger的實現是基於cas(compare and swop)原理;
atomicinteger的語義是:對atomicinteger中維護的int型變數的操作是原子性的;
atomicinteger實現的思想是:每個執行緒中都會擁有共享變數的乙份私有拷貝,但由於多個執行緒都搶著操作共享變數,當前執行緒的私有拷貝已經不是共享變數的最新值;當前執行緒的私有拷貝只有和共享變數的最新值相等時,才能獲得對共享變數的操作權利,這個操作是原子性的;當前執行緒的私有拷貝如何追上共享變數的最新值呢?就是在迴圈中不停的和共享變數最新值比,如果不相等,就把自己更新成最新值,再比,不等再更新,直到自己和最新值相等才獲得了對共享變數的操作權;這套規則是atomicinteger設計的,操作其維護的int值的執行緒遵守之;
需求:每一千條topic統計下各任務名稱的數量,並列印
**:
mapcommap = new hashmap<>();
long scmnamesize = server.getdynamicconfig().loadnamesize();
atomicinteger atomicinteger = new atomicinteger(1);
for (hashmapmessage:msgs)else
num ++ ;
if(num >1000)
logutil.apiinfo("name:"+name) ;
commap.clear();
num = 0;
}continue;
}string msg = jsonobject.fromobject(message).tostring();
list.add(new keyedmessage<>(topic, key, msg));
}
incrementandget()方法就是以原子方式將當前值加 1
多執行緒計數,怎麼保持計數準確
首先使用設計模式中的單件模式,防止多次初始化物件,造成訪問空間的不一致。計數處要加lock,將其他執行緒計數暫時阻塞,保證計數的正確性。如果要想實時計數實時輸出,可以將計數和輸出處一併lock處理,不然不同執行緒的計數和輸出結果未必按順序處理,如此加鎖能保證按順序處理按順序輸出,不過這樣多少都 損失...
多執行緒加鎖計數方法
import threading import time number 0def plus global number global宣告此處的number是外面的全域性變數number for in range 1000000 進行乙個大數級別的迴圈加一運算 number 1print 子執行緒 s...
多執行緒安全計數器
在做效能測試時,需要統計執行一段時間內庫使用鎖的次數 獲取時間戳的次數等。在做這些庫範圍內的某個動作的次數統計時,如果庫內是多執行緒且動作在多個執行緒內都出現。可以使用下面的多執行緒安全的計數器 counter.h ifndef counter h define counter h include ...