Skip to content

JavaScript Atomics

Atomics — bu ko'p oqimli (multi-threaded) dasturlarda umumiy xotira (SharedArrayBuffer) bilan xavfsiz va barqaror ishlashni ta'minlovchi global obyekt.


Xavfsiz xotira (Atomic Operations)

JavaScript-da Web Workers orqali bir vaqtning o'zida bir nechta oqimda ishlash mumkin. Atomics amallari shunday xususiyatga egaki, ular bo'linmasdir (interruptible emas) — ya'ni bir oqim amalni bajarayotganda, boshqasi unga xalaqit bera olmaydi.


Nima uchun Atomics kerak?

Agar ikki yoki undan ortiq oqim (Worker) bitta xotira sohasiga bir vaqtning o'zida yozmoqchi bo'lsa, Race Condition (poygalashish holati) yuzaga keladi. Bu esa ma'lumotlarning noto'g'ri o'qilishiga yoki buzilishiga olib keladi.

Atomics quyidagilarni ta'minlaydi:

  1. Amallarning ketma-ketligi va butunligini.
  2. Oqimlar o'rtasida ma'lumot almashish tartibini.
  3. Bir oqim ikkinchisini kutishini (Wait/Notify).

Atomics bilan ishlash uchun nima kerak?

  1. SharedArrayBuffer: Oqimlar o'rtasida bo'lishiladigan xotira.
  2. Typed Array: Xotirani boshqaruvchi massiv (masalan, Int32Array).
  3. Web Workers: Bir vaqtda ishlovchi oqimlar.

Asosiy metodlar

1. Atomics.load() va Atomics.store()

Ma'lumotni atomik tarzda o'qish va yozish.

js
const buffer = new SharedArrayBuffer(1024)
const array = new Int32Array(buffer)

Atomics.store(array, 0, 100) // Qiymatni xavfsiz yozish
const value = Atomics.load(array, 0) // Qiymatni xavfsiz o'qish

2. Atomics.add() va Atomics.sub()

Qiymatni oshirish yoki kamaytirish (eski qiymatni qaytaradi).

js
Atomics.add(array, 0, 5) // Index 0 dagi qiymatga 5 ni qo'shadi

3. Atomics.wait() va Atomics.notify()

Oqimlarni boshqarish uchun eng muhim metodlar:

  • wait(): Oqimni ma'lum bir shart bajarilguncha to'xtatib turadi ("uxlatadi").
  • notify(): "Uxlayotgan" oqimni uyg'otadi.

WARNING

Atomics.wait() metodini saytning asosiy oqimida (Main Thread) ishlatish taqiqlangan, u faqat Web Workers ichida ishlaydi.


Atomics Metodlari Jadvali

MetodTavsifi
load(array, index)Elementni o'qiydi.
store(array, index, value)Qiymatni yozadi.
add(array, index, value)Qiymatga qo'shadi va eskini qaytaradi.
sub(array, index, value)Qiymatdan ayiradi va eskini qaytaradi.
and/or/xor(array, index, val)Bitli amallarni bajaradi.
exchange(array, index, value)Qiymatni yangilaydi va eskini qaytaradi.
compareExchange(...)Qiymat kutilganidek bo'lsa, uni yangilaydi.
wait(array, index, value)Xotira o'zgarguncha oqimni to'xtatadi.
notify(array, index, count)Uyg'otish xabarini yuboradi.

Xulosa

Atomics — bu juda murakkab va past darajali (low-level) tushuncha. Ko'p hollarda oddiy JavaScript dasturlari unga ehtiyoj sezmaydi. Lekin siz yuqori unumdorlikka ega o'yinlar yoki murakkab hisob-kitoblar bilan ishlayotgan bo'lsangiz, bu bilim asqotadi.