Middle
229
Yarış (race condition) problemini həll etməyin bir yolu varmı?
AI-dan cavab
sobes.tech Süni İntellekt
Bəli, mövcuddur. Əsas yanaşmalar:
- Sinxronizasiya (Synchronization):
synchronizedaçar sözündən metodlar və ya kod blokları üçün istifadə etmək, bu zaman yalnız bir axın bu kodu icra edə bilər. - Bloklamalar (Locks):
java.util.concurrent.lockspaketindən siniflərdən istifadə etmək, məsələn,ReentrantLock, daha çevik nəzarət təmin edir. - Atomik dəyişənlər (Atomic Variables):
java.util.concurrent.atomicpaketindən siniflərdən istifadə etmək, məsələn,AtomicInteger,AtomicLong, atomik əməliyyatlar (oxu- dəyişdir- yaz) təmin edir və açıq bloklamaya ehtiyac qalmır. - Dəyişməz obyektlər (Immutable Objects): Obyektlər yaratmaq, onların vəziyyəti yaradıldıqdan sonra dəyişdirilə bilməz. Əgər bir neçə axın eyni dəyişməz obyektə istinad edirsə, onu dəyişdirə bilməzlər, bu da yarış vəziyyətlərinin qarşısını alır.
- İş parçacığı təhlükəsiz kolleksiyalar (Thread-Safe Collections):
java.util.concurrentpaketindən kolleksiyalardan istifadə etmək, məsələn,ConcurrentHashMap,CopyOnWriteArrayList, çoxlu axınlardan təhlükəsiz giriş təmin edir.
synchronized istifadə nümunəsi:
// Sinxronlaşdırılmış metod nümunəsi
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
ReentrantLock istifadə nümunəsi:
import java.util.concurrent.locks.ReentrantLock;
public class AnotherCounter {
private int count = 0;
private final ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock(); // Lock əldə edir
try {
count++;
} finally {
lock.unlock(); // Lock azad edir
}
}
public int getCount() {
lock.lock(); // Lock əldə edir
try {
return count;
} finally {
lock.unlock(); // Lock azad edir
}
}
}
AtomicInteger istifadə nümunəsi:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicCounter {
private final AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet(); // Atomik artım
}
public int getCount() {
return count.get(); // Atomik oxuma
}
}
Xüsusi bir metod seçimi vəzifənin mahiyyətindən və tələb olunan performans səviyyəsindən asılıdır. Sinxronizasiya istifadə etmək sadədir, lakin əlavə xərclər yarada bilər. Locklar daha çox elastiklik təmin edir. Atomik dəyişənlər sadə əməliyyatlar üçün daha səmərəlidir. Dəyişməz obyektlər və iş parçacığı təhlükəsiz kolleksiyalar istifadə etmək də yarış vəziyyətlərinin qarşısını almağın effektiv yollarıdır.