Atomics - Guia Rápido
Atomics
O Atomics é um objeto em JavaScript que fornece operações atômicas a serem realizadas como métodos estáticos. Assim como os métodos do objeto Math, os métodos e propriedades do Atomics também são estáticos. Atomics são usados com objetos SharedArrayBuffer.
As operações Atomic são instaladas em um Atomics Module. Ao contrário de outros objetos globais, o Atomics não é um construtor. O Atomics não pode ser usado com um novo operador ou pode ser chamado como uma função.
Operações Atômicas
As operações atômicas são ininterruptas.
Quando a memória é compartilhada, vários threads podem ler ou gravar dados existentes na memória. Portanto, se algum dado for alterado, haverá perda de dados. As operações atômicas garantem que os valores previstos (dados) sejam gravados e lidos com precisão. As operações atômicas não serão iniciadas até e a menos que a operação atual seja concluída, portanto, não há como alterar os dados existentes.
Exemplo
A seguir está o código que demonstra o uso da Operação JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
Atomics
O Atomics é um objeto em JavaScript que fornece operações atômicas a serem realizadas como métodos estáticos. Assim como os métodos do objeto Math, os métodos e propriedades do Atomics também são estáticos. Atomics são usados com objetos SharedArrayBuffer.
As operações Atomic são instaladas em um Atomics Module. Ao contrário de outros objetos globais, o Atomics não é um construtor. O Atomics não pode ser usado com um novo operador ou pode ser chamado como uma função.
Operações Atômicas
As operações atômicas são ininterruptas.
Quando a memória é compartilhada, vários threads podem ler ou gravar dados existentes na memória. Portanto, se algum dado for alterado, haverá perda de dados. As operações atômicas garantem que os valores previstos (dados) sejam gravados e lidos com precisão. As operações atômicas não serão iniciadas até e a menos que a operação atual seja concluída, portanto, não há como alterar os dados existentes.
Exemplo
A seguir está o código que demonstra o uso da Operação JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
addmétodo adiciona um valor fornecido em uma determinada posição na matriz. Ele retorna o valor antigo naquela posição. Essa operação atômica garante que nenhuma outra gravação possa ocorrer até que o valor modificado seja gravado de volta.
Sintaxe
Atomics.add(typedArray, index, value)
Parâmetros
typedArray é a matriz digitada por inteiro.
index é a posição no typedarray.
value para ser adicionado.
Retorna
Retorna o valor antigo em determinada posição.
Exceções
TypeError caso a matriz passada não seja uma matriz digitada por inteiro.
RangeError se o índice passado está fora do limite na matriz digitada.
Exemplo
A seguir está o código para implementar JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
andO método calcula o bit a bit AND com um valor fornecido em uma determinada posição na matriz. Ele retorna o valor antigo naquela posição. Essa operação atômica garante que nenhuma outra gravação possa ocorrer até que o valor modificado seja gravado de volta.
Sintaxe
Atomics.and(typedArray, index, value)
Parâmetros
typedArray é a matriz digitada por inteiro.
index é a posição no typedarray.
value com o qual AND bit a bit deve ser calculado.
Retorna
Retorna o valor antigo em determinada posição.
Exceções
TypeError caso a matriz passada não seja uma matriz digitada por inteiro.
RangeError se o índice passado está fora do limite na matriz digitada.
Exemplo
A seguir está o código para implementar JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
compareExchangemétodo compara e troca um valor de substituição se o valor fornecido não for igual ao valor antigo. Ele retorna o valor antigo naquela posição. Essa operação atômica garante que nenhuma outra gravação possa ocorrer até que o valor modificado seja gravado de volta.
Sintaxe
Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)
Parâmetros
typedArray é a matriz digitada por inteiro.
index é a posição no typedarray.
expectedValue para verificar a igualdade.
replacementValue para trocar.
Retorna
Retorna o valor antigo em determinada posição.
Exceções
TypeError caso a matriz passada não seja uma matriz digitada por inteiro.
RangeError se o índice passado está fora do limite na matriz digitada.
Exemplo
A seguir está o código para implementar JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
exchangemétodo troca um determinado valor em determinada posição de uma matriz. Ele retorna o valor antigo naquela posição. Essa operação atômica garante que nenhuma outra gravação possa ocorrer até que o valor modificado seja gravado de volta.
Sintaxe
Atomics.exchange(typedArray, index, value)
Parâmetros
typedArray é a matriz digitada por inteiro.
index é a posição no typedarray.
value para trocar.
Retorna
Retorna o valor antigo em determinada posição.
Exceções
TypeError caso a matriz passada não seja uma matriz digitada por inteiro.
RangeError se o índice passado está fora do limite na matriz digitada.
Exemplo
A seguir está o código para implementar JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
isLockFreemétodo é usado para determinar se os bloqueios devem ser usados ou não para operações atômicas. Se o tamanho fornecido for uma das propriedades TypedArray.BYTES_PER_ELEMENT dos tipos TypedArray inteiros, então ele retorna verdadeiro. TypedArray.BYTES_PER_ELEMENT representa o tamanho em bytes de cada elemento de uma matriz digitada.
Sintaxe
Atomics.isLockFree(size)
Parâmetros
size a ser verificado em bytes.
Retorna
Retorna verdadeiro se a operação está livre de bloqueio como falsa.
Exemplo
A seguir está o código para implementar JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
load método retorna um valor em determinada posição na matriz.
Sintaxe
Atomics.load(typedArray, index)
Parâmetros
typedArray é a matriz digitada por inteiro.
index é a posição no typedarray.
Retorna
Retorna o valor na posição fornecida.
Exceções
TypeError caso a matriz passada não seja uma matriz digitada por inteiro.
RangeError se o índice passado está fora do limite na matriz digitada.
Exemplo
A seguir está o código para implementar JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
notifymétodo notifica o agente em espera para acordar. O método de notificação pode funcionar apenas com Int32Array criado usando SharedArrayBuffer. Ele retorna 0 no caso de um objeto ArrayBuffer não compartilhado ser usado.
Sintaxe
Atomics.notify(typedArray, index, count)
Parâmetros
typedArray é um Int32Array compartilhado.
index é a posição no typedarray para ativar.
count é o número de agentes adormecidos a serem notificados.
Retorna
Retorna o número de agentes acordados.
Exceções
TypeError caso a matriz passada não seja uma matriz digitada por inteiro.
RangeError se o índice passado está fora do limite na matriz digitada.
Exemplo
A seguir está o código para implementar JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
ormétodo calcula o bit a bit OR com um valor fornecido em uma determinada posição na matriz. Ele retorna o valor antigo naquela posição. Essa operação atômica garante que nenhuma outra gravação possa ocorrer até que o valor modificado seja gravado de volta.
Sintaxe
Atomics.or(typedArray, index, value)
Parâmetros
typedArray é a matriz digitada por inteiro.
index é a posição no typedarray.
value com qual OR bit a bit deve ser calculado.
Retorna
Retorna o valor antigo em determinada posição.
Exceções
TypeError caso a matriz passada não seja uma matriz digitada por inteiro.
RangeError se o índice passado está fora do limite na matriz digitada.
Exemplo
A seguir está o código para implementar JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
storemétodo armazena um valor no local fornecido em uma matriz e retorna o mesmo. Essa operação atômica garante que nenhuma outra gravação possa ocorrer até que o valor modificado seja gravado de volta.
Sintaxe
Atomics.store(typedArray, index, value)
Parâmetros
typedArray é a matriz digitada por inteiro.
index é a posição no typedarray onde o valor deve ser armazenado.
value para ser armazenado.
Retorna
Retorna o valor armazenado na posição fornecida.
Exceções
TypeError caso a matriz passada não seja uma matriz digitada por inteiro.
RangeError se o índice passado está fora do limite na matriz digitada.
Exemplo
A seguir está o código para implementar JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
submétodo subtrai um valor fornecido em uma determinada posição na matriz. Ele retorna o valor antigo naquela posição. Essa operação atômica garante que nenhuma outra gravação possa ocorrer até que o valor modificado seja gravado de volta.
Sintaxe
Atomics.sub(typedArray, index, value)
Parâmetros
typedArray é a matriz digitada por inteiro.
index é a posição no typedarray.
value a ser subtraído.
Retorna
Retorna o valor antigo em determinada posição.
Exceções
TypeError caso a matriz passada não seja uma matriz digitada por inteiro.
RangeError se o índice passado está fora do limite na matriz digitada.
Exemplo
A seguir está o código para implementar JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.
xorO método calcula o XOR bit a bit com um valor fornecido em uma determinada posição na matriz. Ele retorna o valor antigo naquela posição. Essa operação atômica garante que nenhuma outra gravação possa ocorrer até que o valor modificado seja gravado de volta.
Sintaxe
Atomics.xor(typedArray, index, value)
Parâmetros
typedArray é a matriz digitada por inteiro.
index é a posição no typedarray.
value com qual XOR bit a bit deve ser calculado.
Retorna
Retorna o valor antigo em determinada posição.
Exceções
TypeError caso a matriz passada não seja uma matriz digitada por inteiro.
RangeError se o índice passado está fora do limite na matriz digitada.
Exemplo
A seguir está o código para implementar JavaScript Atomics -
<!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>
Resultado
Verifique o resultado.