Race condition thread in Java

Race condition (yarış vəziyyəti) iki və ya daha çox paylaşılan məlumatlara daxil ola bildikdə və eyni zamanda onu dəyişdirməyə çalışdıqda baş verir. Nəticədə, dəyişənlərin dəyərləri gözlənilməz ola bilər.

Java-da yarış vəziyyətinə bir nümunə:


class Counter { private int count = 0; public void increment() { count++; } public int getCount() { return count; } } public class Main { public static void main(String[] args) throws InterruptedException { Counter counter = new Counter(); Thread thread1 = new Thread(() -> { for (int i = 0; i < 1000; i++) { counter.increment(); } }); Thread thread2 = new Thread(() -> { for (int i = 0; i < 1000; i++) { counter.increment(); } }); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println(counter.getCount()); // prints a value less than 2000 } }


Bu misalda "increment()" method thread üçün təhlükəsiz deyil, çünki iki thread-in eyni vaxtda onu icra etməsi race condition (yarış vəziyyəti)-nə gətirib çıxara bilər. Artırma əməliyyatı atomik olmadığı üçün "count" dəyəri 2000-dən az ol bilər.

Bu race condition (yarış vəziyyəti) düzətmək üçün "synchronized" açar sözündən istifadə edərək "increment()" methodu thread üçün təhlükəsiz edə bilərsiniz:


class Counter { private int count = 0; public synchronized void increment() { count++; } public int getCount() { return count; } }


"increment()" Bu, race condition (yarış vəziyyəti)  aradan qaldıraraq methodu eyni anda yalnız bir  thread-in icra edə biləcəyini təmin edir.


2 yorum:

  1. Java-ni oyrenmeyi asanlasdiraq

    YanıtlaSil
  2. Kitablar və materiallar üçün linklər => Joshua Bloch - Effective Java (3Rd) - 2018.Pdf cox gozel kitabdir. Javani oyrenenler ucun evezolunmaz bir kitab numuneler ile birlikde

    YanıtlaSil

Smart Presta spcookieslaw