多執行緒計數 AtomicInteger

2021-09-29 23:04:18 字數 1086 閱讀 6018

大家在工作中肯定遇到過計數統計需求,單執行緒的情況下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 ...