Synchronized: bu nədir, işləmə prinsipi və Java-da istifadəsi

Müəllif: IT Sectr Dərc olunub: 2026-03-19 Oxuma vaxtı: 8 dəq

Synchronized Java dilində daxili sinxronizasiya mexanizmidir, kodun kritik bölmələrinə eksklüziv girişi təmin edir. Oracle, 2024-ə görə, synchronized modifikatoru yalnız bir axının qeyd olunmuş metodu və ya bloku müəyyən bir vaxtda icra edə biləcəyinə zəmanət verir. Bu mexanizm monitorlara — əməliyyat sistemlərinin fundamental konsepsiyasına əsaslanır və bütün mürəkkəblik səviyyələrində çoxaxınlı tətbiqlərin düzgün işləməsini təmin edir.

Əsas məqamlar

  • Synchronized — məlumatlara təhlükəsiz giriş üçün Java açar sözü.
  • Obyekt monitoru — sinxronizasiyanın əsaslandığı daxili mexanizm.
  • Synchronized metodu bütün metodu nümunə və ya sinif səviyyəsində bloklayır.
  • Synchronized bloku kodun yalnız bir hissəsini sinxronizasiya etməyə imkan verir.
  • Deadlock — iç-içə sinxronizasiyada əsas problemlərdən biridir.

Synchronized nədir?

Synchronized Java-da açar sözdür ki, yalnız bir axının eyni vaxtda qorunan kod hissəsini icra etməsinə zəmanət verir, paralel giriş zamanı məlumatların zədələnməsinin qarşısını alır. O, Java-nın ilk versiyasında ortaya çıxmışdır və hər səviyyədən tərtibatçılar üçün axın təhlükəsizliyini təmin etməyin ən sadə yolu olaraq qalır.

Tərif və Java-da rolu

Synchronized modifikatoru iki problemi həll edir: qarşılıqlı istisna (mutual exclusion) və dəyişikliklərin görünməsi (visibility). Bir axın synchronized blokundan çıxdıqda, bütün dəyişikliklər eyni obyektdə sinxronizasiya olunmuş bloka daxil olan digər axınlara görünəcəyinə zəmanət verilir.

Synchronized bütün metoda və ya hər hansı kod blokuna monitor-obyekt göstərilərək tətbiq oluna bilər. Hər iki halda JVM bayt-kod səviyyəsində monitorenter və monitorexit təlimatlarını yerləşdirir.

Yaranmasının səbəbləri

Sinxronizasiyasız çoxaxınlı tətbiqlərdə yarış vəziyyəti (race condition) yaranır — iki axın eyni məlumatları eyni anda dəyişdirdikdə gözlənilməz nəticələrə səbəb olur. Synchronized bu problemlə mübarizə üçün Java-nın ilk və əsas vasitəsi olmuşdur, hər bir tərtibatçı üçün əlçatan sadə deklarativ sintaksis təqdim edir.

Synchronized necə işləyir?

Synchronized mexanizmi monitor konsepsiyasına əsaslanır — hər bir Java obyektinə daxil edilmiş yüksək səviyyəli sinxronizasiya primitivi. Monitor obyektlə ilk dəfə synchronized bloku istifadə edildikdə əlaqələndirilir.

Obyekt monitoru

Java-da hər bir obyektin əlaqəli monitoru var. Bir axın synchronized blokuna daxil olduqda, obyektin monitorunu ələ keçirir. Monitor artıq başqa bir axın tərəfindən tutulubsa, axın sərbəst buraxılana qədər bloklanır. Bayt-kodda buna monitorenter və monitorexit təlimatları cütü uyğun gəlir.

Bloklama vəziyyətləri (biased locking)

JVM synchronized-i bir neçə səviyyə vasitəsilə optimallaşdırır: təkaxınlı giriş üçün biased locking (yönləndirilmiş bloklama), zəif rəqabətdə lightweight locking (yüngül bloklama) və intensiv rəqabətdə OS iştirakı ilə heavyweight locking (ağır bloklama). Bu səviyyələr kodu dəyişmədən performansı artırır.

java
class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

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

Happens-before qaydası

Synchronized happens-before əlaqəsini qurur: synchronized blokundan çıxmazdan əvvəl axındakı bütün hərəkətlər eyni obyektdə sinxronizasiya olunmuş bloka daxil olduqdan sonra digər axına görünür. Bu, təkcə qarşılıqlı istisnanı deyil, həm də bütün axınlar üçün məlumatların ardıcıllığını təmin edir.

Synchronized metod vs blok

Java synchronized tətbiqinin iki yolunu təklif edir: metod səviyyəsində və blok səviyyəsində. Seçim onların arasında performansa və sinxronizasiyanın dənəvərliyinə təsir edir.

Synchronized metodu

Metodu synchronized modifikatoru ilə qeyd edərək, onu avtomatik olaraq cari nümunədə (adi metod üçün) və ya Class obyektində (statik metod üçün) sinxronizasiya edirsiniz. Bu, qarşılıqlı istisnanı təmin etməyin ən sadə yoludur, lakin kritik bölmə metodun yalnız kiçik bir hissəsini təşkil edirsə və qalan kod sinxronizasiya tələb etmirsə, çox vaxt həddindən artıqdır.

Synchronized bloku

Synchronized bloku dəqiq nəzarət verir: siz monitor-obyekti təyin edir və kodun yalnız lazımi hissəsini sinxronizasiya edirsiniz, metodun qalan hissəsini bloklamadan kənarda qoyursunuz. Bu, monitorun saxlanma müddətini minimuma endirir və çoxaxınlı mühitdə tətbiqin ümumi performansını artırır, çünki digər axınlar monitorun sərbəst buraxılmasını gözləmədən paralel olaraq əlaqəsiz kodu icra edə bilər.

java
class DataProcessor {
    private final Object lock = new Object();

    public void process() {
        // kritik bölmədən kənar kod - sinxronizasiyasız
        prepareData()

        synchronized (lock) {
            // yalnız bu blok qorunur
            updateSharedState()
        }

        // bloklamadan davam
        cleanup()
    }
}
MeyarSynchronized metodSynchronized blok
Monitorthis (nümunə) və ya Classistənilən obyekt
Dənəvərlikbütün metodyalnız lazımi kod
Oxunaqlılıqyüksəkorta
Performansböyük metoda görə aşağıkiçik kritik bölmədə yüksək

Android-də synchronized

Android tərtibatında synchronized SharedPreferences, DB girişi və UI komponentlərinin qorunması üçün geniş istifadə olunur. Bununla belə, onun əsas axında istifadəsi interfeysin donma riski səbəbindən qəti şəkildə tövsiyə edilmir.

SharedPreferences ilə istifadə

Android-də SharedPreferences əsas axın təhlükəsizliyini təmin edir, lakin bir neçə axın tərəfindən Editor vasitəsilə redaktə edilərkən xarici sinxronizasiya tələb oluna bilər. Ayrıca bloklama obyekti ilə synchronized bloku dəyişikliklərin ardıcıllığına zəmanət verir.

kotlin
class PreferencesManager(private val prefs: SharedPreferences) {
    private val lock = Any()

    fun writeToken(token: String) {
        synchronized (lock) {
            prefs.edit()
                .putString("auth_token", token)
                .apply()
        }
    }
}

Android tətbiqlərində məhdudiyyətlər

Android-də synchronized-in əsas məhdudiyyəti — axın bloklaması. Mutex ilə korutinlərdən fərqli olaraq, synchronized sistem axınını tamamilə bloklayır. Əsas axında bu ANR-yə səbəb olur. Müasir Android tərtibatında synchronized-in korutinlər (suspend Mutex) və ya atomik tiplər (AtomicInteger) ilə əvəz edilməsi tövsiyə olunur.

Synchronized alternativləri

Müasir Java və Kotlin synchronized-ə bir neçə alternativ təklif edir, onların hər biri eyni vəzifələri daha az məhdudiyyət və ya daha yaxşı performansla həll edir.

java.util.concurrent-dən Lock

Lock interfeysi ReentrantLock və ReadWriteLock reallaşdırmaları ilə vaxt aşımı, kəsilə bilən gözləmə və bir neçə Condition növbəsi təqdim edir. Synchronized-dən daha çevikdir, lakin finally-də açıq şəkildə sərbəst buraxılması tələb olunur, bu da unudulmuş unlock səbəbindən xəta riskini artırır.

Atomik siniflər

AtomicInteger, AtomicLong, AtomicReference və digər siniflər CAS (Compare-And-Swap) əsasında Lock-Free alqoritmlərindən istifadə edir. Onlar orta rəqabət ssenarilərində synchronized-dən əhəmiyyətli dərəcədə sürətlidir, çünki axınları bloklamır, optimistik təkrar cəhdlər edir və OS nüvəsi tərəfindən kontekst dəyişməsi tələb etmir.

ThreadLocal və axın təhlükəsizliyi

ThreadLocal alternativ yanaşma təqdim edir: hər bir ThreadLocal dəyişəni bir axın çərçivəsində təcrid olunur və oxumaq/yazmaq üçün sinxronizasiya tələb etmir. Bu, axınlar arasında paylaşılmamalı olan məlumatlar üçün synchronized ehtiyacını tamamilə aradan qaldırır. ThreadLocal freymvorklarda (Spring, Hibernate) tranzaksiya konteksti və sessiyaların saxlanması üçün fəal şəkildə istifadə olunur.

Korutinlər və compose yanaşması

Android üçün Kotlin layihələrində synchronized alternativi kotlinx.coroutines-dən Mutex-dir. O, əməliyyat sistemi axınını bloklamır, bloklama sərbəst buraxılana qədər korutini dayandırır — bu, hovuz axınlarından səmərəli istifadə etməyə və resursun sərbəst buraxılmasını uzun müddət gözləyərkən ANR-dən qaçmağa imkan verir.

kotlin
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var counter = 0

suspend fun safeIncrement() {
    mutex.withLock {
        counter++
    }
}

Synchronized performansı

Synchronized performansı Java-nın son versiyalarında əhəmiyyətli dərəcədə dəyişmişdir. Əvvəllər onu "ağır" mexanizm hesab edirdilər, lakin müasir JVM-lər JIT-kompilyatorun qabaqcıl optimallaşdırmaları sayəsində əlavə yüklərin çoxunu aradan qaldırmışdır. Virtual maşının sinxronizasiya olunmuş kodu icra vaxtında necə sürətləndirdiyini ətraflı nəzərdən keçirək.

Biased Locking və Lock Coarsening

JVM-in JIT-kompilyatoru bir neçə optimallaşdırma tətbiq edir: biased locking bloklamanı həmişə bir axın tutursa, sinxronizasiyanı aradan qaldırır; lock coarsening qonşu synchronized bloklarını birində birləşdirir; lock elimination obyekt yalnız bir axın üçün əlçatandırsa, sinxronizasiyanı silir. Bu optimallaşdırmalar aşağı rəqabətdə synchronized-i praktiki olaraq pulsuz edir.

Rəqabətin ölçülməsi və optimallaşdırma seçimi

JVM hər bir obyekt üçün rəqabət səviyyəsini müəyyən edir: rəqabət olmadıqda biased locking işə salınır, ikinci axın görünəndə bloklama spin-gözləmə ilə lightweight rejiminə keçir və yalnız uzun gözləmədə — sistem mutexi ilə heavyweight-ə keçir. Bu eskalasiya avtomatik baş verir və tərtibatçı əl ilə strategiya seçmək məcburiyyətində deyil.

Lock və atomik siniflərlə müqayisə

Müasir benchmarklarda (Java 17+) synchronized aşağı və orta rəqabətdə ReentrantLock ilə müqayisə edilə bilən performans göstərir. Yüksək rəqabətdə Lock, timeout və kəsmə dəstəyi ilə daha səmərəli gözləmə növbəsi sayəsində üstünlük əldə edə bilər. Rəqabətin daimi olduğu yüksək yüklü sistemlər üçün fair rejimində ReentrantLock daha proqnozlaşdırıla bilən davranış verir.

Atomik siniflər (AtomicInteger, AtomicReference) sadə sayğaclar və bayraqlar üçün CAS üzərində Lock-Free reallaşdırma sayəsində ən sürətli olaraq qalır. Onlar axınları ümumiyyətlə bloklamır — konflikt olduqda əməliyyat sadəcə dövrədə təkrarlanır. Bu, 4-8 axında sayğac artımı əməliyyatlarında synchronized ilə müqayisədə 3-5 dəfə performans artımı verir.

Tez-tez verilən suallar

Synchronized və volatile arasında nə fərq var?

Synchronized həm qarşılıqlı istisnanı, həm də görünməni təmin edir. Volatile yalnız dəyişikliklərin görünməsinə zəmanət verir — volatile dəyişəninə yazma bütün axınlara görünür, lakin eyni vaxtda dəyişmənin qarşısını almır, yəni yarış vəziyyətindən qorumur.

Synchronized deadlock-a səbəb ola bilərmi?

Bəli, deadlock müxtəlif monitor sırası ilə iç-içə sinxronizasiyada mümkündür. Məsələn, bir axın synchronized(a) { synchronized(b) }, digəri isə synchronized(b) { synchronized(a) } çağırır. İç-içə synchronized bloklarından qaçın və ya vahid monitor sırasını təyin edin.

Java-da monitor nədir?

Monitor — hər bir Java obyekti ilə əlaqəli sinxronizasiya mexanizmidir. O, yalnız bir axının verilmiş obyektdə synchronized kodunu icra etməsinə zəmanət verir. Monitor bloklama, gözləmə növbəsi və wait/notify vasitəsilə bildiriş gözləyən axınlar hovuzunu əhatə edir.

Lock synchronized-dən sürətli olur?

Java-nın müasir versiyalarında (17+) synchronized JIT optimallaşdırmaları (biased locking, lock coarsening) sayəsində Lock-dan performans baxımından geri qalmır. Lock sürətə görə deyil, əlavə imkanlara görə üstünlük təşkil edir: vaxt aşımı, kəsilə bilən gözləmə və bir neçə Condition.

Synchronized statik metodlarla necə işləyir?

Statik synchronized metodu sinfin nümunəsinin deyil, həmin sinfin Class obyektinin monitorundan istifadə edir. Bu o deməkdir ki, sinxronizasiya sinfin bütün nümunələrini əhatə edir. Qeyri-statik və statik synchronized metodları fərqli monitorlardan istifadə edir və bir-birini bloklamır.

Xülasə

  • Synchronized — monitorlara əsaslanan daxili Java sinxronizasiya mexanizmi.
  • Obyekt monitoru — qarşılıqlı istisnanı təmin edən JVM daxili strukturu.
  • wait/notify metodları yalnız synchronized blokları və ya metodları daxilində istifadə olunur.
  • Synchronized bloku daha incə dənəvər sinxronizasiyaya görə metoddan üstündür.
  • Happens-before eyni obyektdə sinxronizasiya zamanı axınlar arasında dəyişikliklərin görünməsinə zəmanət verir.
  • Deadlock — müxtəlif monitor sırası ilə iç-içə sinxronizasiyada əsas risk.
  • Alternativlər — Lock, atomik siniflər və suspending Mutex ilə korutinlər.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun