Sobes.tech
Middle

Ի՞նչ են օպտիմիստական և պессիմիստական արգելքները։

sobes.tech AI

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

Օպտիմիստական և պեսիմիստական փակումները՝ դա մրցակցային միջավայրերում (բազմասխալային ծրագրեր, տվյալների բազաներ) ընդհանուր տվյալների մուտքի կառավարման մոտեցումներ են:

Պեսիմիստական փակումը:

Նախատեսում է, որ տվյալների մուտքի ժամանակ հավանական են կոնֆլիկտները: Նախքան ռեսուրսին մուտք գործելը, հոսքը կամ գործարքը այն փակագծում է (առանձին կամ բաժանված փակագծով): Այլ հոսքերը, որոնք փորձում են մուտք գործել, կսպասեն, մինչև փակագծը բացվի:

  • Առավելություններ: Տվյալների ամբողջականությունը ապահովում է, հեշտ է իրականացնել ցածր մրցակցությամբ:
  • Կողմեր: Կարող է հանգեցնել deadlock-ների, բարձր մրցակցությամբ՝ նվազեցնել անցանելիությունը:
  • Օրինակներ: synchronized բանալի բառը Java-ում, փակագծեր տողային կամ աղյուսակային մակարդակով տվյալների բազաներում:
// Պեսիմիստական փակման օրինակ Java-ում
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++; // Փակագծում է օբյեկտի վրա, միայն մեկ հոսք կարող է կատարել այս մեթոդը միաժամանակ
    }

    public synchronized int getCount() {
        return count;
    }
}

Օպտիմիստական փակումը:

Նախատեսում է, որ տվյալների մուտքի ժամանակ անհավանական են կոնֆլիկտները: Տվյալների մուտքը կատարվում է առանց փակագծերի: Փոփոխությունները պահելուց առաջ ստուգվում է, արդյոք տվյալները փոխվել են այլ հոսքի կողմից, երբ դրանք կարդացվել էին: Եթե փոխվել են, գործողությունը չեղյալ է հայտարարվում և սովորաբար կրկնվում է (retry):

  • Առավելություններ: Բարձր անցանելիություն՝ ցածր մրցակցությամբ, առանց deadlock-ների:
  • Կողմեր: Կոնֆլիկտներ կարող են առաջանալ, որոնք պահանջում են կրկնություն, ինչը բարդացնում է տրամաբանությունը:
  • Օրինակներ: Compare-And-Swap (CAS) գործողություններ, տարբերակման կառավարման համակարգեր (versioning) տվյալների բազաներում՝ օրինակ՝ տարբերակի սյուն կամ ժամանակային նշան օգտագործելով:
// Օպտիմիստական փակման օրինակ CAS-ով (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;

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

    public void increment() {
        // Ատոմիկ ավելացման փորձ
        // Եթե արժեքը փոխվել է միջեւ ընթերցում և նորացման փորձի, գործողությունը կրկնվում է
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}

Համեմատություն:

Գծագիր Պեսիմիստական փակումը Օպտիմիստական փակումը
Նպատկեր Կոնֆլիկտները հավանական են Կոնֆլիկտները քիչ հավանական են
Մուտք Փակագծում մինչև մուտք գործելը Մուտք առանց փակագծերի, ստուգում գրանցման ժամանակ
Բարձր կոնֆլիկտային արագության դեպքում Կարող է հանգեցնել փակագծերի, նվազեցնել անցանելիությունը Շատ հաճախակի կրկնություններ, նվազեցնել արտադրողականությունը
Նվազ կոնֆլիկտային արագության դեպքում Կարող է ավելացնել ծախսեր Բարձր անցանելիություն
Deadlock խնդիր Միջնորդ է Անհնար (համառոտ մուտքի տեսանկյունից)