İş parçaları yarışları niyə baş verir və onlarla mübarizə aparmaq üçün hansı üsullar mövcuddur?
sobes.tech Süni İntellekt
AI-dan cavab
Yarış şərtləri (race conditions) bir neçə axın eyni zamanda ümumi dəyişdirilə bilən verilərə müraciət etdikdə və nəticənin icra sırasına bağlı olduğu zaman baş verir. Bu, əməliyyat sistemi hər zaman axınları dəyişə biləcəyi və onların icrasını kəsə biləcəyi üçün baş verir.
Bunlarla mübarizə yolları:
-
Sinxronizasiya: Paylaşılan resurslara eksklüziv giriş təmin etmək üçün sinxronizasiya primitive-lərindən istifadə.
-
synchronizedaçar sözü: Metodlara və ya kod bloklarına tətbiq edilir. Cari axın tamamlanana qədər digər axınlar üçün obyektə və ya sinfə giriş bloklanır.// Sinxronizasiya olunan metod public synchronized void updateData(int newValue) { // ... ümumi məlumatların yenilənməsi } // Kod blokunun sinxronizasiyası public void processData() { synchronized (this) { // və ya başqa monitor obyekti // ... ümumi məlumatlara giriş } } -
Locklər:synchronizedilə müqayisədə daha çevik nəzarət təmin edir.import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; private final Lock dataLock = new ReentrantLock(); public void safeUpdateData(int newValue) { dataLock.lock(); // Lock əldə etmək try { // ... ümumi məlumatların yenilənməsi } finally { dataLock.unlock(); // Lock-i azad etmək } }
-
-
Atomik dəyişənlər (
Atomic...): Açıq blokirovsuz, primitiv tiplər üzərində axınlararası təhlükəsiz əməliyyatlar təmin edir. Sadə əməliyyatlar üçün istifadə olunur (inkrement, müqayisə və dəyişdirmə).import java.util.concurrent.atomic.AtomicInteger; private final AtomicInteger counter = new AtomicInteger(0); public void incrementCounter() { counter.incrementAndGet(); // Atomik artırma } -
Axınlararası təhlükəsiz kolleksiyalar:
java.util.concurrentpaketindən xüsusi kolleksiyaların istifadəsi (məsələn,ConcurrentHashMap,CopyOnWriteArrayList) çoxsaylı axınların girişinə uyğundur.import java.util.concurrent.ConcurrentHashMap; import java.util.Map; private final Map<String, Integer> safeMap = new ConcurrentHashMap<>(); -
Dəyişməz (Immutable) obyektlər: Əgər məlumatlar yaradıldıqdan sonra dəyişməzsə, çoxsaylı axınlar tərəfindən təhlükəsiz şəkildə istifadə oluna bilər.
-
ThreadLocaldəyişənləri: Hər bir axına öz nüsxəsi verilir, bu da giriş yarışını qarşısını alır.private final ThreadLocal<Integer> threadId = new ThreadLocal<>(); public void setThreadId() { threadId.set(Thread.currentThread().getId()); } public int getThreadId() { return threadId.get(); } -
Düzgün memarlıq dizaynı: Paylaşılan dəyişkən məlumatların miqdarını azaltmaq və axınlar arasında asinxron yanaşmalar və ya mesaj ötürmə istifadə etmək yarış şərtlərinin yaranma ehtimalını azalda bilər.