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.