Sobes.tech
Middle+

Механизмии ҳамоҳангсозии 'synchronized' дар Java дар пасзамина чӣ гуна кор мекунад?

sobes.tech AI

Ҷавоб аз AI

Механизми synchronized дар Java асос ёфтааст ба консепсияи мониторҳо (monitor objects). Ҳар як объект дар Java бо монитор алоқаманд аст.

Вақте ки як ҷараён ба блок ё методи синхронизатсия дохил мешавад, кӯшиш мекунад, ки монитор мувофиқро ба даст орад. Агар монитор озод бошад, он онро мегирад ва идома медиҳад. Агар монитор дар ихтиёри дигар ҷараён бошад, ҷараёни ҳозира банд мешавад ва ба ҳолати интизорӣ мегузарад, то монитор озод шавад.

Вақте ки ҷараён аз блок ё методи синхронизатсия мебарояд (хушбахтона ё бо истисно), он мониторро озод мекунад.

Дар дохили мониторҳо амалан:

  1. Меъёри мутақобил (Mutual Exclusion): Танҳо як ҷараён метавонад дар як вақт соҳиби монитор бошад. Ин кафолат медиҳад, ки танҳо як ҷараён метавонад кодро дар дохили объект иҷро кунад.
  2. Интизорӣ ва огоҳӣ (Waiting and Notification): Монитор дорои маҷмӯи методҳо wait(), notify() ва notifyAll() мебошад. Ин методҳо ба ҷараёнҳое, ки мониторро доранд, имкон медиҳанд, ки онро муваққатан озод кунанд ва дар ҳолати интизорӣ гузаранд, ва баъдан бо огоҳии дигар ҷараёнҳо барои идомаи кор огоҳӣ дода шаванд.

Дар пасзамина, инҳо дар бар мегиранд:

  • monitorenter дастур: Вақте ки ба блок ё методи синхронизатсия дохил мешавед, иҷро мешавад. кӯшиш мекунад, ки мониторро ба даст орад.
  • monitorexit дастур: Вақте ки аз блок ё методи синхронизатсия мебарояд, иҷро мешавад. Мониторро озод мекунад.

Ин дастурҳо қисми коди байт (bytecode) дар Java мебошанд ва тавассути JVM коркард мешаванд. JVM аз механизмҳои нативии системаи оператсионӣ (масалан mutexes, semaphores) барои идоракунии мониторҳо ва бастани/озод кардани ҷараёнҳо истифода мебарад.

Гирифтани монитор метавонад дар сатҳи объект (барои методҳо ва блокҳои instance) ё дар сатҳи синф (барои static методҳо ва блокҳо) амалӣ карда шавад, бо истифода аз объект Class ҳамчун блокировка.

Масалан барои истифода:

public class Counter {
    private int count = 0;

    public synchronized void increment() { // Метод синхронизатсияшуда
        count++;
    }

    public void decrement() {
        synchronized (this) { // Блоки синхронизатсияшуда
            count--;
        }
    }

    public static synchronized void staticMethod() { // Метод статикӣ синхронизатсияшуда
        // ...
    }
}

Таблисаи методҳо дар класи Object, ки бо мониторҳо алоқаманд аст:

Метод Тавсиф
wait() Ҷараён, ки мониторро дорад, муваққатан онро озод мекунад ва ба ҳолати интизорӣ мегузарад.
notify() Яке аз ҷараёнҳои интизорро огоҳ мекунад, ки метавонад кӯшиш кунад, ки мониторро ба даст орад ва корро идома диҳад.
notifyAll() Ҳамаи ҷараёнҳои интизорро огоҳ мекунад.