Atomik - Hızlı Kılavuz

Atom bilimi

Atomik, JavaScript'te atomik işlemlerin statik yöntemler olarak gerçekleştirilmesini sağlayan bir nesnedir. Tıpkı Math nesnesinin yöntemleri gibi, Atomics'in de yöntemleri ve özellikleri statiktir. Atomik, SharedArrayBuffer nesneleriyle kullanılır.

Atomik işlemler bir Atomik Modül üzerine kurulur. Diğer küresel nesnelerin aksine, Atomics bir kurucu değildir. Atomlar yeni bir operatörle kullanılamaz veya bir işlev olarak çağrılabilir.

Atomik İşlemler

Atomik işlemler kesintisizdir.

Hafıza paylaşıldığında, hafızada var olan bir veriyi birden çok iş parçacığı okuyabilir veya yazabilir. Bu nedenle, herhangi bir veri değiştirilirse, veri kaybı olacaktır. Atomik işlemler, tahmin edilen değerlerin (verilerin) doğru yazıldığından ve okunduğundan emin olun. Atomik işlemler mevcut işlem bitene kadar başlamaz, bu nedenle var olan bir veriyi değiştirmenin bir yolu yoktur.

Misal

Aşağıda, JavaScript Atomik İşleminin kullanımını gösteren kod verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

Atom bilimi

Atomik, JavaScript'te atomik işlemlerin statik yöntemler olarak gerçekleştirilmesini sağlayan bir nesnedir. Tıpkı Math nesnesinin yöntemleri gibi, Atomics'in de yöntemleri ve özellikleri statiktir. Atomik, SharedArrayBuffer nesneleriyle kullanılır.

Atomik işlemler bir Atomik Modül üzerine kurulur. Diğer küresel nesnelerin aksine, Atomics bir kurucu değildir. Atomlar yeni bir operatörle kullanılamaz veya bir işlev olarak çağrılabilir.

Atomik İşlemler

Atomik işlemler kesintisizdir.

Hafıza paylaşıldığında, hafızada var olan bir veriyi birden çok iş parçacığı okuyabilir veya yazabilir. Bu nedenle, herhangi bir veri değiştirilirse, veri kaybı olacaktır. Atomik işlemler, tahmin edilen değerlerin (verilerin) doğru yazıldığından ve okunduğundan emin olun. Atomik işlemler mevcut işlem bitene kadar başlamaz, bu nedenle var olan bir veriyi değiştirmenin bir yolu yoktur.

Misal

Aşağıda, JavaScript Atomik İşleminin kullanımını gösteren kod verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

addyöntem, dizideki belirli bir konuma sağlanan bir değer ekler. Bu konumdaki eski değeri döndürür. Bu atomik işlem, değiştirilen değer geri yazılıncaya kadar başka hiçbir yazma işleminin olmamasını sağlar.

Sözdizimi

Atomics.add(typedArray, index, value)

Parametreler

  • typedArray tamsayı yazılan dizidir.

  • index typedarray'deki konumdur.

  • value eklenecek.

Dönüş

Verilen konumdaki eski değeri döndürür.

İstisnalar

  • TypeError aktarılan dizinin tamsayı türü bir dizi olmaması durumunda.

  • RangeError aktarılan dizin, yazılan dizide sınır dışıysa.

Misal

Aşağıda JavaScript Atomics'i uygulama kodu verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

andyöntem, dizideki belirli bir konumda sağlanan bir değerle bit düzeyinde VE'yi hesaplar. Bu konumdaki eski değeri döndürür. Bu atomik işlem, değiştirilen değer geri yazılıncaya kadar başka hiçbir yazma işleminin olmamasını sağlar.

Sözdizimi

Atomics.and(typedArray, index, value)

Parametreler

  • typedArray tamsayı yazılan dizidir.

  • index typedarray'deki konumdur.

  • value bitsel AND ile hesaplanacak.

Dönüş

Verilen konumdaki eski değeri döndürür.

İstisnalar

  • TypeError aktarılan dizinin tamsayı türü bir dizi olmaması durumunda.

  • RangeError aktarılan dizin, yazılan dizide sınır dışıysa.

Misal

Aşağıda JavaScript Atomics'i uygulama kodu verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.and(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            //6 & 2 = 110 & 010 = 010 = 2
            container.innerHTML = Atomics.and(arr, 0, 2) + '<br/>'+ Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

compareExchangeyöntem, verilen değer eski değerle aynı değilse, değiştirme değerini karşılaştırır ve değiştirir. Bu konumdaki eski değeri döndürür. Bu atomik işlem, değiştirilen değer geri yazılıncaya kadar başka hiçbir yazma işleminin olmamasını sağlar.

Sözdizimi

Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)

Parametreler

  • typedArray tamsayı yazılan dizidir.

  • index typedarray'deki konumdur.

  • expectedValue eşitliği kontrol etmek için.

  • replacementValue değişim için.

Dönüş

Verilen konumdaki eski değeri döndürür.

İstisnalar

  • TypeError aktarılan dizinin tamsayı türü bir dizi olmaması durumunda.

  • RangeError aktarılan dizin, yazılan dizide sınır dışıysa.

Misal

Aşağıda JavaScript Atomics'i uygulama kodu verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.compareExchange(arr, 0, 6, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.compareExchange(arr, 0, 6, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

exchangeyöntem, bir dizinin belirli konumunda belirli bir değeri değiştirir. Bu konumdaki eski değeri döndürür. Bu atomik işlem, değiştirilen değer geri yazılıncaya kadar başka hiçbir yazma işleminin olmamasını sağlar.

Sözdizimi

Atomics.exchange(typedArray, index, value)

Parametreler

  • typedArray tamsayı yazılan dizidir.

  • index typedarray'deki konumdur.

  • value değişim için.

Dönüş

Verilen konumdaki eski değeri döndürür.

İstisnalar

  • TypeError aktarılan dizinin tamsayı türü bir dizi olmaması durumunda.

  • RangeError aktarılan dizin, yazılan dizide sınır dışıysa.

Misal

Aşağıda JavaScript Atomics'i uygulama kodu verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.exchange(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.exchange(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

isLockFreeyöntem, kilitlerin atomik işlemler için kullanılıp kullanılmayacağını belirlemek için kullanılır. Belirtilen boyut, TypedArray tamsayı türlerinin TypedArray.BYTES_PER_ELEMENT özelliğinden biriyse true değerini döndürür. TypedArray.BYTES_PER_ELEMENT, yazılan dizinin her bir öğesinin bayt cinsinden boyutunu temsil eder.

Sözdizimi

Atomics.isLockFree(size)

Parametreler

  • size bayt olarak kontrol edilecek.

Dönüş

İşlem yanlış olarak kilitsiz ise doğru döndürür.

Misal

Aşağıda JavaScript Atomics'i uygulama kodu verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.isLockFree(1)</p>
      <p>Atomics.isLockFree(3)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            // Int8Array.BYTES_PER_ELEMENT = 1
            container.innerHTML = Atomics.isLockFree(Int8Array.BYTES_PER_ELEMENT) + '<br/>' + Atomics.isLockFree(3);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

load yöntem, dizide belirli bir konumda bir değer döndürür.

Sözdizimi

Atomics.load(typedArray, index)

Parametreler

  • typedArray tamsayı yazılan dizidir.

  • index typedarray'deki konumdur.

Dönüş

Verilen konumdaki değeri döndürür.

İstisnalar

  • TypeError aktarılan dizinin tamsayı türü bir dizi olmaması durumunda.

  • RangeError aktarılan dizin, yazılan dizide sınır dışıysa.

Misal

Aşağıda JavaScript Atomics'i uygulama kodu verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

notifyyöntem, bekleyen temsilciye uyanmasını bildirir. notify yöntemi yalnızca SharedArrayBuffer kullanılarak oluşturulan Int32Array ile çalışabilir. Paylaşılmayan ArrayBuffer nesnesinin kullanılması durumunda 0 döndürür.

Sözdizimi

Atomics.notify(typedArray, index, count)

Parametreler

  • typedArray paylaşılan bir Int32Array'dir.

  • index uyanmak için typedarray konumunda.

  • count bildirilecek uyku ajanlarının sayısıdır.

Dönüş

Uyandırılan aracıların sayısını döndürür.

İstisnalar

  • TypeError aktarılan dizinin tamsayı türü bir dizi olmaması durumunda.

  • RangeError aktarılan dizin, yazılan dizide sınır dışıysa.

Misal

Aşağıda JavaScript Atomics'i uygulama kodu verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.store(arr, 0, 5)</p>
      <p>Atomics.notify(arr, 0, 1)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(16);
            var arr = new Int32Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;            
            container.innerHTML = Atomics.store(arr, 0, 5) + '<br>' + Atomics.notify(arr, 0, 1);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

oryöntem, dizideki belirli bir konumda sağlanan bir değerle bit düzeyinde VEYA'yı hesaplar. Bu konumdaki eski değeri döndürür. Bu atomik işlem, değiştirilen değer geri yazılıncaya kadar başka hiçbir yazma işleminin olmamasını sağlar.

Sözdizimi

Atomics.or(typedArray, index, value)

Parametreler

  • typedArray tamsayı yazılan dizidir.

  • index typedarray'deki konumdur.

  • value bitsel OR ile hesaplanacak.

Dönüş

Verilen konumdaki eski değeri döndürür.

İstisnalar

  • TypeError aktarılan dizinin tamsayı türü bir dizi olmaması durumunda.

  • RangeError aktarılan dizin, yazılan dizide sınır dışıysa.

Misal

Aşağıda JavaScript Atomics'i uygulama kodu verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.or(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            //6 | 2 = 110 | 010 = 110 = 6
            container.innerHTML = Atomics.or(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

storeyöntem, bir dizide sağlanan konumda bir değeri saklar ve aynı değeri döndürür. Bu atomik işlem, değiştirilen değer geri yazılıncaya kadar başka hiçbir yazma işleminin olmamasını sağlar.

Sözdizimi

Atomics.store(typedArray, index, value)

Parametreler

  • typedArray tamsayı yazılan dizidir.

  • index değerin depolanacağı dizideki konumdur.

  • value saklanacak.

Dönüş

Verilen konumda saklanan değeri döndürür.

İstisnalar

  • TypeError aktarılan dizinin tamsayı türü bir dizi olmaması durumunda.

  • RangeError aktarılan dizin, yazılan dizide sınır dışıysa.

Misal

Aşağıda JavaScript Atomics'i uygulama kodu verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.store(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;           
            container.innerHTML = Atomics.store(arr, 0, 2) + '<br/>'
            + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

subyöntem, dizideki belirli bir konumda sağlanan değeri çıkarır. Bu konumdaki eski değeri döndürür. Bu atomik işlem, değiştirilen değer geri yazılıncaya kadar başka hiçbir yazma işleminin olmamasını sağlar.

Sözdizimi

Atomics.sub(typedArray, index, value)

Parametreler

  • typedArray tamsayı yazılan dizidir.

  • index typedarray'deki konumdur.

  • value çıkarılacak.

Dönüş

Verilen konumdaki eski değeri döndürür.

İstisnalar

  • TypeError aktarılan dizinin tamsayı türü bir dizi olmaması durumunda.

  • RangeError aktarılan dizin, yazılan dizide sınır dışıysa.

Misal

Aşağıda JavaScript Atomics'i uygulama kodu verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.sub(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            //6 - 2 = 4
            container.innerHTML = Atomics.sub(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.

xoryöntem, dizide belirli bir konumda sağlanan bir değerle bitsel XOR'u hesaplar. Bu konumdaki eski değeri döndürür. Bu atomik işlem, değiştirilen değer geri yazılıncaya kadar başka hiçbir yazma işleminin olmamasını sağlar.

Sözdizimi

Atomics.xor(typedArray, index, value)

Parametreler

  • typedArray tamsayı yazılan dizidir.

  • index typedarray'deki konumdur.

  • value hangi bitsel XOR ile hesaplanacak.

Dönüş

Verilen konumdaki eski değeri döndürür.

İstisnalar

  • TypeError aktarılan dizinin tamsayı türü bir dizi olmaması durumunda.

  • RangeError aktarılan dizin, yazılan dizide sınır dışıysa.

Misal

Aşağıda JavaScript Atomics'i uygulama kodu verilmiştir -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.xor(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            //6 xor 2 = 110 xor 010 = 100 = 4
            container.innerHTML = Atomics.xor(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Çıktı

Sonucu doğrulayın.