Sobes.tech
Middle+

Ինչ է CAS մեխանիզմը (Compare-And-Swap)?

sobes.tech AI

Պատասխան AI-ից

Compare-And-Swap (CAS) մեխանիզմը միատիպ մեքենայական օպերացիա է, որը օգտագործվում է առանց բլոկավորման սինխրոնիզացիայի իրականացման համար:

Աշխատանքի սկզբունք:

  1. Կարդում է հիշողության բջջի ընթացիկ արժեքը (expectedValue):
  2. Փորձում է գրել նոր արժեք (newValue) այդ բջիջում միայն այն դեպքում, եթե ընթացիկ արժեքը համընկնում է expectedValue-ի հետ:
  3. Վերադարձնում է բուլյան արժեք՝ true, եթե գրառումը հաջողվեց (այդ դեպքում համընկնում էր), false հակառակ դեպքում:

Java-ում CAS-ը իրականացվում է java.util.concurrent.atomic փաթեթի դասարաններում, օրինակ՝ AtomicInteger, AtomicLong, AtomicReference:

Օրինակ՝ AtomicInteger-ի օգտագործման:

// java
import java.util.concurrent.atomic.AtomicInteger;

public class CasExample {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        while (true) {
            int expectedValue = count.get(); // Կարդում է ընթացիկ արժեքը
            int newValue = expectedValue + 1;
            if (count.compareAndSet(expectedValue, newValue)) {
                // Եթե ընթացիկ արժեքը չի փոխվել այն պահից, երբ այն կարդացվեց,
                // կատարում է գրառումը և դուրս գալիս ցիկլից
                break;
            }
            // Եթե արժեքը փոխվել է, կրկնում է փորձը
        }
    }
}

Առավելություններ՝

  • Անկապ: թելերը միմյանց չեն բլոկավորում, ինչը նվազեցնում է կոնտեքստի փոխարկման ծախսերը, հատկապես ցածր մրցակցությամբ:
  • Արձակում է deadlock խնդիրները:

Անբարենպաստություններ՝

  • ABA խնդիր՝ եթե բջջի արժեքը փոխվում է A-ից B և հետո վերադառնում A, CAS-ը կհամարի, որ փոփոխություններ չեն եղել: Այս խնդիրը լուծելու համար օգտագործվում են AtomicStampedReference կամ AtomicMarkableReference դասարանները:
  • Բարձր մրցակցությամբ կարող է լինել շատ անբավարար փորձեր (spin loops):