Atomics
=======

**Experimental:** **Esta é uma tecnologia experimental (en-US)**  
Verifique a tabela de compatibilidade entre Navegadores cuidadosamente antes de usar essa funcionalidade em produção.

O objeto **`Atomics`** fornece operações atômicas como metodos estáticos. Eles são usados com objetos `SharedArrayBuffer` (en-US).

As operações atômicas estão localizadas no modulo `Atomics`. Diferente de outros *global objects*, `Atomics` não é um construtor. Você não deve usa-lo com o `new` operator ou invocar objetos `Atomics` como funções. Todas as propriedades e método do `Atomics` são estáticos (como é o caso com o objeto `Math`, por exemplo).

Métodos
-------

### Operações Atômicas

Quando a memória é compartilhada, multiplas threads podem ser lidas e escritas no mesmo dado da memória. Operações atômicas garantem que os valores previstos sejam lidos e escritos, estas operações são finalizadas antes da próxima operação iniciar e que as mesmas não sejam interrompidas.

`Atomics.add()`

Adiciona o valor recebido na posiçao recebida no array. Retorna o valor anterior nesta posição.

`Atomics.and()` (en-US)

Calcula um bit a bit AND na posição recebida no array. Retorna o valor anterior nesta posição.

`Atomics.compareExchange()` (en-US)

Armazena o valor recebido na posição recebida no array, se este foi igual ao valor recebido. Retorna o valor anterior nesta posição.

`Atomics.exchange()` (en-US)

Armazena o valor recebido na posição recebida no array. Retorna o valor anterior.

`Atomics.load()` (en-US)

Retorna o valor na posição recebida no array.

`Atomics.or()` (en-US)

Calcula um bit a bit OR na posição recebida no array. Retorna o valor anterior nesta posição.

`Atomics.store()` (en-US)

Armazena o valor recebido na posição recebida no array. Retorna o valor.

`Atomics.sub()` (en-US)

Subtrai o valor recebido na posição recebida no array. Retorna o valor anterior nesta posição.

`Atomics.xor()` (en-US)

Calcula um bit a bit XOR na posição recebida no array. Retorna o valor anterior nesta posição.

### Wait e wake

Os métodos `wait()` e `wake()` são modelados no Linux futexes ("fast user-space mutex") e fornece formas de aguardar até que certas condições se tornem `true` e são tipicamente usadas como construtores de bloco.

`Atomics.wait()` (en-US)

Verifica se a posição informada no array ainda contém a valor recebido e dorme à espera ou até o tempo limite. Retorna `"ok"`, `"not-equal"`, ou `"timed-out"`. Se a espera não for permitida no agente de chamada ele irá lançar uma exceção de erro (muitos navegadores não permitem `wait()` na thread main do navegador).

`Atomics.wake()` (en-US)

"Acorda" alguns agentes que estavam "dormindo" na lista de espera na posição recebida do array. Retorna o número de agentes que estão sendo "acordados".

`Atomics.isLockFree(size)` (en-US)

Uma otimização primitiva que pode ser usada para determinar se deve ser usado lock ou operações atômicas. Retorna `true`, se uma operação atômica em matrizes de um dado tamanho do elemento vai ser implementado utilizando uma operação atômica de hardware (como oposição a lock). Só para experientes.

Especificações
--------------

| Specification |
| --- |
| ECMAScript Language Specification # sec-atomics-object |

Compatibilidade com navegadores
-------------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Observações de compatibilidade
------------------------------

[3] A especificação de compartilhamento de memória está sendo estabilizada. Anterior ao SpiderMonkey 48, a última API e semântica não foram implementadas ainda. As alterações entre as versões 46 e 48 do Firefox são:

* Os métodos `Atomics.futexWakeOrRequeue()` e `Atomics.fence()` foram totalmente removidos (Erro do Firefox 1259544 e Erro do Firefox 1225028).
* O método `Atomics.wait()` (en-US) e `Atomics.wake()` (en-US) foram nomeados como `Atomics.futexWait()` e `Atomics.futexWake()` (Erro do Firefox 1260910). Os nomes antigos foram mantidos como alias, e serão removidos na versão 49 (Erro do Firefox 1262062).
* As propriedades `Atomics.OK`, `Atomics.TIMEDOUT`, `Atomics.NOTEQUAL` foram removidas. O método `Atomics.wait()` (en-US) agora retorna "ok", "timed-out" e "not-equal" (Erro do Firefox 1260835).
* O parâmetro `count` do método `Atomics.wake()` (en-US) foi alterado: este agora possui o valor padrão `+Infinity`, e não `0` (Erro do Firefox 1253350).
Veja Também
-----------

* `ArrayBuffer`
* JavaScript typed arrays
* Web Workers
* parlib-simple – a simple library providing synchronization and work distribution abstractions.
* Shared Memory – a brief tutorial