Sobes.tech
Middle

Zašto dolazi do trka u niti i kako se s tim može boriti?

sobes.tech АИ

Одговор од АИ

Race uslovi (race conditions) nastaju kada više niti istovremeno pristupaju zajedničkim promenljivim podacima, a krajnji rezultat zavisi od reda izvršavanja. Problem je što planer niti može prebaciti nit u bilo kom trenutku, a operacija nad podacima koja deluje atomarno u kodu može biti prekinuta i izvršena delimično od strane drugih niti.

Borba protiv trka na nitima svodi se na obezbeđivanje ispravnog pristupa zajedničkim resursima. Osnovne metode:

  • Sinhronizacija: Ograničavanje istovremenog pristupa kritičnim sekcijama koda gde se koriste zajednički podaci. Popularni mehanizmi:

    • synchronized ključna reč: Osigurava zaključavanje na nivou objekta ili klase.
    // Zaključavanje na nivou objekta
    synchronized (this) {
        // Kritična sekcija
        sharedData++;
    }
    
    // Zaključavanje na nivou klase
    synchronized (MyClass.class) {
        // Kritična sekcija
        sharedStaticData++;
    }
    
    • Eksterni blokatori (Lock interfejs, ReentrantLock): Pružaju veću fleksibilnost, na primer, mogućnost da pokušate da dobijete zaključavanje ili da ga dobijete sa timeout-om.
    Lock lock = new ReentrantLock();
    // ...
    lock.lock(); // Dobijanje zaključavanja
    try {
        // Kritična sekcija
        sharedData++;
    } finally {
        lock.unlock(); // Oslobađanje zaključavanja (obavezno u finally)
    }
    
  • Aтомарне операције: Korišćenje klasa iz paketa java.util.concurrent.atomic, koje pružaju atomarne operacije (npr. inkrement, poređenje i razmena) bez eksplicitnog zaključavanja na nivou niti.

    import java.util.concurrent.atomic.AtomicInteger;
    
    AtomicInteger atomicCounter = new AtomicInteger(0);
    // ...
    atomicCounter.incrementAndGet(); // Atomarnо povećanje
    
  • Nit-zaštitne kolekcije: Korišćenje kolekcija iz paketa java.util.concurrent (npr. ConcurrentHashMap, CopyOnWriteArrayList), koje su dizajnirane za rad u višepotnom okruženju.

  • Neizmenjive (immutable) objekte: Ako podaci nakon kreiranja ne mogu biti menjani, višestruki pristup njima neće izazvati trke na nitima.

  • Thread-Local Storage: Svaka nit ima svoju kopiju promenljive, čime se eliminiše problem zajedničkog pristupa.

Izbor metode zavisi od konkretne situacije i zahtevanog nivoa sinhronizacije. Preterana sinhronizacija može dovesti do značajnih troškova i čak deadlock-a.