# LongAdder ç¨æ³åæºç åæ
* [LongAdder ç¨æ³åæºç åæ](#longadder-ç¨æ³åæºç åæ)
* [为ä»ä¹å¼å
¥ LongAdder](#为ä»ä¹å¼å
¥-longadder)
* [è®¤è¯ LongAdder](#认è¯-longadder)
* [è®¤è¯ Striped64](#认è¯-striped64)
* [æå
³é®ç longAccumulate](#æå
³é®ç-longaccumulate)
* [LongAdder çå认è¯](#longadder-çå认è¯)
* [åè®°](#åè®°)
æä»¬å¨ä¹åçæç« ä¸ä»ç»å°äº AtomicLong ï¼å¦æä½ è¿ä¸äºè§£ï¼æå»ºè®®ä½ é
读ä¸ä¸è¿ç¯æç«
[Atomic ååå·¥å
·ç±»è¯¦è§£](https://github.com/crisxuan/bestJavaer/blob/master/java-concurrent/java-atomicxxx.md)
为ä»ä¹æè¦å
说 AtomicLong å¢ï¼å 为 LongAdder çè®¾è®¡æ¯æ ¹æ® AtomicLong çç¼ºé·æ¥è®¾è®¡çã
## 为ä»ä¹å¼å
¥ LongAdder
æä»¬ç¥éï¼AtomicLong æ¯å©ç¨åºå±ç CAS æä½æ¥æä¾å¹¶åæ§çï¼æ¯å¦ `addAndGet` æ¹æ³
```java
public final long addAndGet(long delta) {
return unsafe.getAndAddLong(this, valueOffset, delta) + delta;
}
```
æä»¬è¿ç¥éï¼CAS æ¯ä¸ç§è½»é级çèªææ¹æ³ï¼å®çé»è¾æ¯éç¨èªæçæ¹å¼ä¸ææ´æ°ç®æ å¼ï¼ç´å°æ´æ°æåã(ä¹å³ä¹è§éçå®ç°æ¨¡å¼)
å¨å¹¶åæ°éæ¯è¾ä½çåºæ¯ä¸ï¼çº¿ç¨å²çªçæ¦çæ¯è¾å°ï¼èªæç次æ°ä¸ä¼å¾å¤ã使¯ï¼å¨å¹¶åæ°éæ¿å¢çæ
åµä¸ï¼ä¼åºç°å¤§éå¤±è´¥å¹¶ä¸æèªæçåºæ¯ï¼æ¤æ¶ AtomicLong çèªææ¬¡æ°å¾å®¹æä¼æä¸ºç¶é¢ã
为äºè§£å³è¿ç§ç¼ºé·ï¼å¼å
¥äºæ¬ç¯æç« çä¸»è§ --- LongAdderï¼å®ä¸»è¦è§£å³é«å¹¶åç¯å¢ä¸ AtomictLong çèªæç¶é¢é®é¢ã
## è®¤è¯ LongAdder
æä»¬å
çä¸ä¸ JDK æºç ä¸å
³äº LongAdder ç讨论
è¿æ®µè¯å¾æ¸
æ°ç表æï¼å¨å¤çº¿ç¨ç¯å¢ä¸ï¼å¦æä¸å¡åºæ¯æ´ä¾§éäº`ç»è®¡æ°æ®`æè
`æ¶éä¿¡æ¯`çè¯ï¼**LongAdder è¦æ¯ AtomicLong ææ´å¥½çæ§è½ï¼ååéæ´é«ï¼ä½æ¯ä¼å ç¨æ´å¤çå
å**ãå¨å¹¶åæ°éè¾ä½æè
å线ç¨åºæ¯ä¸ï¼AtomicLong å LongAdder å
·æç¸åçç¹å¾ï¼ä¹å°±æ¯è¯´ï¼å¨ä¸è¿°åºæ¯ä¸ï¼AtomicLong å LongAdder å¯ä»¥äºæ¢ã
é¦å
æä»¬å
æ¥çä¸ä¸ LongAdderç±»çå®ä¹ï¼

å¯ä»¥çå°ï¼LongAdder ç»§æ¿äº *Striped64*ç±»ï¼å¹¶å®ç°äº *Serializable* æ¥å£ã
Striped64 åæ¯ç»§æ¿äº Number ç±»ï¼ç°å¨ä½ å¯è½ä¸å¤ªæ¸
æ¥ Striped64 æ¯åä»ä¹çï¼ä½æ¯ä½ 嫿¥ã

æä»¬ç¥éï¼Number ç±»æ¯åºæ¬æ°æ®ç±»åçå
è£
类以åååæ§å
è£
ç±»çç¶ç±»ï¼ç»§æ¿ Number 类表示å®å¯ä»¥å½ä½æ°å¼è¿è¡å¤çï¼ç¶èè¿æ ·å¹¶ä¸è½è¯´æä»ä¹ï¼å®å¯¹æä»¬æ¥è¯´è¿æ¯ä¸å¤´é¾æ°´ï¼éåæç¿»äºç¿» Striped64 çç»§æ¿ä½ç³»ï¼åç°è¿ä¸ªç±»æå 个å®ç°ï¼èè¿å 个å®ç°è½å¤å¾å¥½ç叮婿们çè§£ä»ä¹æ¯ Striped64ã

å¨å
¶ä¸æä»¬çå°äº *Accumulator*ï¼å®ç䏿æ¦å¿µå°±æ¯**ç´¯å å¨**ï¼æä»¥æä»¬çæµ Striped64 ä¹è½å®ç°ç´¯å çåè½ãæä¸å
¶ç¶ï¼å¨ææ±å©äºé¨åå¸åä¹åï¼æä»¬å¯ä»¥å¾åºæ¥ä¸ä¸ªç»è®ºï¼**Striped64 å°±æ¯ä¸ä¸ªæ¯æ 64 ä½çç´¯å å¨**ã
使¯é£ä¸¤ä¸ª Accumulator çå®ç°å¯ä»¥å®ç°ç´¯å ï¼è¿ä¸ªå¥½çè§£ï¼ä½æ¯è¿ä¸¤ä¸ª Adder å¢ï¼å®ä»¬ä¹è½å®ç°ç´¯å çåè½åï¼
æä»¬å次ç»è´çæ¥çä¸ä¸ LongAdder å DoubleAdder çæºç ï¼å 为è¿ä¸¤ä¸ªç±»é常ç¸ä¼¼ï¼ã
ï¼ä¸é¢çåäºé£æ ¼ä¸»è¦ä»¥ LongAdder 为åï¼DoubleAdder ä¼å
¼å¸¦çèä¸ä¸ï¼ä½ä¸æ¯ä¸»è¦åäºå¯¹è±¡ï¼æ¯ç«è¿ä¸¤ä¸ªç±»çåºç±»é常ç¸ä¼¼ãï¼
å¨ç¿»é
䏿³¢æºç è¿åï¼æä»¬åç°äºä¸äºæ¹æ³ï¼æ¯å¦ *incrementãdecrementãaddãresetãsum*çï¼è¿äºæ¹æ³çèµ·æ¥å¥½åæ¯ä¸ä¸ªç´¯å å¨ææ¥æçåè½ã
å¨è¯¦ç»ç¿»é
æºç åï¼æè®¤è¯äºæçæ³æ³ï¼å 为 increment ãdecrement 齿¯è°ç¨ç add æ¹æ³ï¼è add æ¹æ³åºå±å使ç¨äº *longAccmulate*ï¼æç»ä½ ç»ä¸ªå¾ä½ å°±ç¥éäºã

æä»¥ï¼LongAdder ç第ä¸ä¸ªç¹æ§å°±æ¯å¯ä»¥å¤çæ°å¼ï¼èå®ç°äº Serializable è¿ä¸ªæ¥å£è¡¨ç¤º LongAdder å¯ä»¥åºååï¼ä»¥ä¾¿åå¨å¨æä»¶ä¸æå¨ç½ç»ä¸ä¼ è¾ã
ç¶åæä»¬ç»§ç»å¾ä¸èµ°ï¼ç°å¨æ¶é´çç½çæåäº LongAdder ç add æ¹æ³ï¼æä»¬èåéé¢å·²ç»æå°è±¡ï¼è¿ä¸ª LongAdder æ¹æ³æ¯æ¥åå¹¶åç´¯å çï¼æä»¥è¿ä¸ª add æ¹æ³å¦æä¸åºæå¤å°±æ¯å¹¶åçç´¯å æ¹æ³ï¼é£ä¹å¾å¥æªäºï¼è¿ä¸ªæ¹æ³ä¸ºä»ä¹æ²¡æä½¿ç¨ synchronized å¢ï¼
æä»¬ç»§ç»è§å¯ add æ¹æ³é½åäºåªäºæä½ã

å¼å§æ¶å°±æ¯åé
äºä¸äºåéèå·²åï¼è¿ä¹æ²¡ä»ä¹ç¹æ®çï¼ç»§ç»çå°ç¬¬äºè¡çæ¶åï¼æä»¬åç°æä¸ä¸ª *cells* 对象ï¼è¿ä¸ª cells 对象æ¯ä¸ªæ°ç»ï¼å¥½åæ¯ä¸ªå
¨å±çããããããé£ä¹å¨åªéå®ä¹çå¢ï¼
䏿³å°è¿æä¸ª Striped64 è¿ä¸ªç±»ï¼ææç¹è¿å»çå°äºè¿ä¸ªå
¨å±åéï¼å¦å¤ï¼Striped64 è¿ä¸ªç±»å¾éè¦ï¼æä»¬å¯ä¸è½æå®å¿äºã
å¨ Striped64 ç±»ä¸ï¼èµ«ç¶åºç°äºä¸é¢è¿ä¸ä¸ªéè¦çå
¨å±åéã
ç± transient 修饰çè¿ä¸ä¸ªå
¨å±åéï¼ä¼ä¿è¯ä¸ä¼è¢«åºååã
æä»¬å
ä¸è§£éè¿ä¸ä¸ªå鿝ä»ä¹ï¼æä»ä¹ç¨ï¼å 为æä»¬å忏å°äº add æ¹æ³ï¼æä»¥è¿æ¯åå° add æ¹æ³ä¸æ¥ï¼
ç»§ç»åä¸èµ°ï¼æä»¬çå°äº *caseBase* æ¹æ³ï¼è¿ä¸ªæ¹æ³åæ¯å¹²ä»ä¹çï¼ç¹è¿å»ï¼åç°è¿æ¯ Striped64 ä¸çæ¹æ³ï¼ç°å¨ï¼æä»¬é·å
¥äºæ²æã
**æä»¬ä¸é¢åªæ¯ç¥éäº Striped64 æ¯ä¸ä¸ªç´¯å å¨ï¼ä½æ¯æç°å¨è¦ä¸è¦æ¸ä¸é Striped64 çæºç ï¼ï¼ï¼ï¼ï¼ï¼**
## è®¤è¯ Striped64
æç¶åºæ¥æ··é½æ¯è¦è¿çï¼ä¸é¢æ²¡æä»ç»ç Striped64 çä¸ä¸ªåéï¼ç°å¨å°±è¦å¥½å¥½ä»ç»ä¸æ³¢äºã
* cells 宿¯ä¸ä¸ªæ°ç»ï¼å¦æä¸æ¯ null ï¼å®ç大å°å°±æ¯ 2 çæ¬¡æ¹ã
* base æ¯ Striped64 çåºæ¬æ°å¼ï¼**主è¦å¨æ²¡æäºç¨æ¶ä½¿ç¨ï¼åæ¶ä¹ä½ä¸º cells åå§åæ¶ä½¿ç¨ï¼ä½¿ç¨ CAS è¿è¡æ´æ°**ã
* cellsBusy 宿¯ä¸ä¸ª `SpinLock(èªæé)`ï¼å¨åå§å cells æ¶ä½¿ç¨ã
é¤äºè¿ä¸ä¸ªåéä¹å¤ï¼è¿æä¸ä¸ªåéï¼æç«ç¶æå®å¿½è§äºï¼ç½ªè¿ç½ªè¿ã
å®è¡¨ç¤ºçæ¯ CPU çæ ¸æ°ã
好å并没æçåºæ¥ä»ä¹çæºï¼æ¥çå¾ä¸èµ°
è¿éåºç°äºä¸ä¸ª Cell å
ç´ çå
é¨ç±»ï¼éé¢åºç°äº long åç value å¼ï¼cas æ¹æ³ï¼*UNSAFE*ï¼valueOffSet å
ç´ ï¼å¦æä½ çè¿æçè¿ç¯æç« [Atomic ååå·¥å
·ç±»è¯¦è§£](https://github.com/crisxuan/bestJavaer/blob/master/java-concurrent/java-atomicxxx.md) æè
ä½ äºè§£ AtomicLong ç设计çè¯ï¼ä½ å°±ç¥éï¼Cell ç设计æ¯å AtomicLong å®å
¨ä¸æ ·çï¼é½æ¯ä½¿ç¨äº volatile åéãUnsafe å ä¸å段çåç§»éï¼åç¨ CAS è¿è¡ä¿®æ¹ã
èè¿ä¸ª Cell å
ç´ ï¼å°±æ¯ cells æ°ç»ä¸çæ¯ä¸ªå¯¹è±¡ã
è¿éæ¯è¾ç¹æ®çæ¯ `@sun.misc.Contended` 注解ï¼å®æ¯ Java 8 䏿°å¢ç注解ï¼ç¨æ¥é¿å
ç¼åç伪å
±äº«ï¼åå° CPU ç¼å级å«çç«äºã
害ï¼å°±è¿ï¼
å
ä¸è¦çæ¥ï¼Striped64 ææ ¸å¿çåè½æ¯åå«ä¸º LongAdder å DoubleAdder æä¾å¹¶åç´¯å çåè½ï¼æä»¥ Striped64 ä¸ç longAccumulate å doubleAccumulate ææ¯å
³é®ï¼æä»¬ä¸»è¦ä»ç» longAccumulate æ¹æ³ï¼æ¹æ³æ¯è¾é¿ï¼æä»¬æ
¢æ
¢è¿å
¥èå¥ã
### æå
³é®ç longAccumulate
å
è´´åºæ¥ longAccumulate ç宿´ä»£ç ï¼ç¶åæä»¬åè¿è¡åæï¼
```java
final void longAccumulate(long x, LongBinaryOperator fn,
boolean wasUncontended) {
// è·å线ç¨çåå¸å¼
int h;
if ((h = getProbe()) == 0) {
ThreadLocalRandom.current(); // force initialization
h = getProbe();
wasUncontended = true;
}
boolean collide = false; // True if last slot nonempty
for (;;) {
Cell[] as; Cell a; int n; long v;
if ((as = cells) != null && (n = as.length) > 0) { // cells å·²ç»åå§åäº
if ((a = as[(n - 1) & h]) == null) { // 对åºç cell ä¸åå¨ï¼éè¦æ°å»º
if (cellsBusy == 0) { // åªæå¨ cells 没ä¸éæ¶æå°è¯æ°å»º
Cell r = new Cell(x);
if (cellsBusy == 0 && casCellsBusy()) { // ä¸é
boolean created = false;
try { // ä¸éå夿 cells 对åºå
ç´ æ¯å¦è¢«å ç¨
Cell[] rs; int m, j;
if ((rs = cells) != null &&
(m = rs.length) > 0 &&
rs[j = (m - 1) & h] == null) {
rs[j] = r;
created = true;
}
} finally {
cellsBusy = 0;
}
if (created) // cell åå»ºå®æ¯ï¼å¯ä»¥éåº
break;
continue; // å éååç° cell å
ç´ å·²ç»ä¸å为空ï¼è½®è¯¢éè¯
}
}
collide = false;
}
// ä¸é¢è¿äº else å¨å°è¯æ£æµå½åç«äºåº¦å¤§ä¸å¤§ï¼å¦æå¤§åå°è¯æ©å®¹ï¼å¦
// ææ©å®¹å·²ç»æ²¡ç¨äºï¼åå°è¯ rehash æ¥åæ£å¹¶åå°ä¸åç cell ä¸
else if (!wasUncontended) // å·²ç¥ CAS 失败ï¼è¯´æå¹¶å度大
wasUncontended = true; // rehash åéè¯
else if (a.cas(v = a.value, ((fn == null) ? v + x : // å°è¯ CAS å°å¼æ´æ°å° cell ä¸
fn.applyAsLong(v, x))))
break;
else if (n >= NCPU || cells != as) // cells æ°ç»å·²ç»å¤å¤§ï¼rehash
collide = false; // At max size or stale
else if (!collide) // å°æ¤è¯´æå
¶å®ç«äºå·²ç»å¾å¤§ï¼rehash
collide = true;
else if (cellsBusy == 0 && casCellsBusy()) { // rehash 齿²¡ç¨ï¼å°è¯æ©å®¹
try {
if (cells == as) { // å éè¿ç¨ä¸å¯è½æå
¶å®çº¿ç¨å¨æ©å®¹ï¼éè¦æé¤è¯¥æ
å½¢
Cell[] rs = new Cell[n << 1];
for (int i = 0; i < n; ++i)
rs[i] = as[i];
cells = rs;
}
} finally {
cellsBusy = 0;
}
collide = false;
continue; // Retry with expanded table
}
h = advanceProbe(h); // rehash
}
else if (cellsBusy == 0 && cells == as && casCellsBusy()) { // cells æªåå§å
boolean init = false;
try { // Initialize table
if (cells == as) {
Cell[] rs = new Cell[2];
rs[h & 1] = new Cell(x);
cells = rs;
init = true;
}
} finally {
cellsBusy = 0;
}
if (init)
break;
}
else if (casBase(v = base, ((fn == null) ? v + x :
fn.applyAsLong(v, x))))
break; // å
¶å®çº¿ç¨å¨åå§å cells æå¨æ©å®¹ï¼å°è¯æ´æ° base
}
}
```
å
å«å¿çæè®¶ï¼æ´çå¥½å¿æ
æ
¢æ
¢çã
é¦å
ï¼å¨ Striped64 ä¸ï¼ä¼å
计ç®åå¸ï¼åå¸å¼ç¨äºåå线ç¨å° cells æ°ç»ãStriped64 ä¸å©ç¨äº Thread ç±»ä¸ç¨æ¥åä¼ªéæºæ°ç `threadLocalRandomProbe`ï¼
```java
public class Thread implements Runnable {
@sun.misc.Contended("tlr")
int threadLocalRandomProbe;
}
```
Striped64 ä¸å¤å¶ï¼ç´æ¥æ¿æ¥ç¨ï¼äº `ThreadLocalRandom` ä¸çä¸äºæ¹æ³ï¼ä½¿ç¨ unsafe æ¥è·ååä¿®æ¹å段å¼ã
å¯ä»¥ç解为 `getProbe` ç¨æ¥è·ååå¸å¼ï¼`advanceProbe` ç¨æ¥æ´æ°åå¸å¼ã
èå
¶ä¸ç `PROBE` 叏鿝å¨ç±»å è½½çæ¶åä»ç±»å è½½å¨æåç threadLocalRandomProbe ç常éå¼ã
ç¶åæ¯ä¸ç³»åç循ç¯å¤æå cell æ°ç»æ å°çæä½ï¼å 为 Cells ç±»å ç¨æ¯è¾å¤ç空é´ï¼æä»¥å®çåå§åæéè¿è¡çï¼å¼å§æ¶ä¸ºç©ºï¼éè¦æ¶å
å建两个å
ç´ ï¼ä¸å¤ç¨æ¶åæ©å±æä¸¤å大å°ãå¨ä¿®æ¹ cells æ°ç»ï¼å¦æ©å±ï¼æ¶éè¦å éï¼è¿ä¹å°±æ¯ `cellsBusy` çä½ç¨ã
éæ¾éåªéè¦å° cellsBusy ä» 0 -> 1 å³å¯ã
```java
cellsBusy = 0;
```
å¦å¤ï¼è¿ä¸ªæ¹æ³è½ç¶ä»£ç è¡å¾å¤ï¼ä½¿ç¨äºå¾å¤ if else ï¼ä½å
¶å®ä»£ç 设计使ç¨äº*å鿣æ¥é*ï¼ä¹å°±æ¯ä¸é¢è¿ç§æ¨¡å¼
```java
if (condition_met) { // åªå¨å¿
è¦æ¶è¿å
¥
lock(); // å é
done = false; // å 为å¤å±æè½®è¯¢ï¼éè¦è®°å½ä»»å¡æ¯å¦éè¦ç»§ç»
try {
if (condition_met) { // åé¢ç if å°å éé´ç¶æå¯è½ååï¼éè¦éæ°å¤æ
// ...
done = true; // ä»»å¡å®æ
}
} finally {
unlock(); // ç¡®ä¿ééæ¾
}
if (done) // ä»»å¡å®æï¼å¯ä»¥éåºè½®è¯¢
break;
}
```
è `doubleAccumulate` çæ´ä½é»è¾ä¸ longAccumulate å ä¹ä¸æ ·ï¼åºå«å¨äºå° double å卿 long æ¶éè¦è½¬æ¢ãä¾å¦å¨å建 cell æ¶ï¼éè¦
```java
Cell r = new Cell(Double.doubleToRawLongBits(x));
```
doubleToRawLongBits æ¯ä¸ä¸ª native æ¹æ³ï¼å° `double` 转æ `long`ãå¨ç´¯å æ¶éè¦å转æ¥åï¼
```java
else if (a.cas(v = a.value,
((fn == null) ?
Double.doubleToRawLongBits
(Double.longBitsToDouble(v) + x) : // 转å double åç´¯å
Double.doubleToRawLongBits
(fn.applyAsDouble
(Double.longBitsToDouble(v), x)))))
```
ä¸é¢çæµç¨æä»¬åªæ¯é«åº¦æ¦æ¬äºä¸ï¼å®é
ç忝è¦è¿æ¯æä»¬æ¦æ¬çæ´å¤ï¼longAccumulate 伿 ¹æ®ä¸åçç¶ææ¥æ§è¡ä¸åçåæ¯ï¼æ¯å¦å¨çº¿ç¨ç«äºé常æ¿ççæ
åµä¸ï¼è¿ä¼éè¿å¯¹ cells è¿è¡æ©å®¹æè
éæ°è®¡ç®åå¸å¼æ¥éæ°åæ£çº¿ç¨ï¼è¿äºåæ³çç®çæ¯å°å¤ä¸ªçº¿ç¨ç计æ°è¯·æ±åæ£å°ä¸åç cell ä¸ç index ä¸ï¼è¿å
¶å®å `ConcurrentHashMap` ç设计æè·¯ä¸æ ·ï¼åªä¸è¿ Java7 ä¸ç ConcurrentHashMap å®ç° segment å é使ç¨äºæ¯è¾éç `synchronized` éï¼è Striped64 使ç¨äºè½»é级ç unsafe CAS æ¥è¿è¡å¹¶åæä½ã
**ä¸å£æ°ç»äºè®²å®ä¸ä¸ªæ®µè½äºï¼ç´¯å±æäºï¼æä¼ç»§ç»èä¸é¢**ã

ä¸é¢å说å LongAdder è¿ä¸ªç±»ã
## LongAdder çå认è¯
æä»¥ï¼LongAdder çåçå°±æ¯ï¼å¨æåæ ç«äºæ¶ï¼åªæ´æ° base å¼ï¼å½æå¤çº¿ç¨ç«äºæ¶éè¿åæ®µçææ³ï¼è®©ä¸åççº¿ç¨æ´æ°ä¸åçæ®µï¼æåæè¿äºæ®µç¸å å°±å¾å°äºå®æ´ç LongAdder åå¨çå¼ï¼ä¸é¢æç»ä¸ªå¾å¸®å©ä½ çè§£ä¸ä¸ã

å¦æä½ çè§£äºä¸é¢ Striped64 çæè¿°åä¸é¢è¿å¹
å¾ä¹åï¼LongAdder ä½ å°±çè§£çå·®ä¸å¤äºï¼æåè¿æä¸ä¸ª LongAdder ä¸ç sum æ¹æ³éè¦å¼ºè°ä¸ï¼
`sum` æ¹æ³ä¼è¿åå½åæ»åï¼å¨æ²¡æå¹¶åçæ
åµä¸ä¼è¿åä¸ä¸ªåç¡®çç»æï¼ä¹å°±æ¯æææç base å¼ç¸å æ±åä¹åçç»æï¼é£ä¹ï¼ç°å¨æä¸ä¸ªé®é¢ï¼å¦æåé¢å·²ç»ç´¯å å° sum ä¸ç Cell ç value å¼æä¿®æ¹ï¼ä¸å°±æ²¡æ³è®¡ç®äºåï¼
>è¿éçç»è®ºå°±æ¯ï¼LongAdder 䏿¯å¼ºä¸è´æ§çï¼å®æ¯æç»ä¸è´æ§ã
## åè®°
è¿ç¯æåä½ èäºä¸ä¸ä¸ºä»ä¹å¼å
¥ LongAdder 以å AtomicLong æåªäºç¼ºé·ï¼ç¶åå¸¦ä½ äºè§£äºä¸ä¸ LongAdder çæºç åå®çåºå±å®ç°ï¼å¦æè¿ç¯æç« å¯¹ä½ æå¸®å©çè¯ï¼å¯ä»¥ç»æä¸ªä¸è¿ï¼ä½ çæ¯ææ¯ææ´æ°æå¤§çå¨åï¼

