LongAdder의 작동 방식에 대한 질문이 아닙니다. 알아낼 수없는 흥미로운 구현 세부 사항입니다. 여기 LongAdder Striped64 wasUncontended 구현 세부 사항
이 Striped64에서 코드입니다 (나는 일부를 잘라 질문에 대한 관련 부품 떠 났어요) : 코드에서 많은 것들이이를 제외하고, 나에게 분명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) {
if ((a = as[(n - 1) & h]) == null) {
//logic to insert the Cell in the array
}
// CAS already known to fail
else if (!wasUncontended) {
wasUncontended = true; // Continue after rehash
}
else if (a.cas(v = a.value, ((fn == null) ? v + x : fn.applyAsLong(v, x)))){
break;
}
를 :
// CAS already known to fail
else if (!wasUncontended) {
wasUncontended = true; // Continue after rehash
}
다음 CAS가 실패한다는 확실성은 어디에 있습니까? 이 검사는 하나의 사례에 대해서만 의미가 있습니다. 적어도 일부 스레드가 longAccumulate 메서드를 n 번째 시간 (n> 1)에 입력하고 사용중인 스핀이 첫 번째 사이클 인 경우 .
이 코드는 다음과 같이 말합니다 : 여러분 (일부 스레드)이 이전에 여기 있었고 특정 셀 슬롯에 경합이 있다면 CAS 값을 기존의 CAS 슬롯에 CAS하려고하지 마십시오. 조사.
나는 누군가를 위해 어떤 의미를 갖기를 희망합니다.
1) 어디서 왔는지 알고 있습니다. 2) 젠장! * CAS가 이미 실패한 것으로 알려진 *은 다음 CAS 작업이 실패한다는 것을 의미합니다. 이전 CAS 작업이 실패합니다. 나는 당신의 추측을 좋아한다. 아마도 코드에 대한 최적의 추가라고 증명할 수있는 테스트를했을 것이다. 귀하의 의견은 대단히 감사하겠습니다. – Eugene
예, 나는 당신의 이론에 대해 99 % 확신하고 있습니다 (코드를 다시 본 후). 그것은 나에게 직관적이지만, 그 코드를 유지하는 사람에게는 인스턴스 감각을 줄 수 있습니다. 다시 한번 고맙습니다. 나는 이것을 받아 들일 것입니다. – Eugene
그게 가장 현명한 설명입니다. 언젠가 CAS로 정수를 증가시키는 철저한 경쟁 루프를 시도하십시오. 과중한 경쟁으로 쉽게 90 % 실패한 CAS를 얻을 수 있습니다. – Voo