Manipulação de threads e condições de corrida em Javascript

Vamos supor que eu tenho um código como o seguinte:

var shared = 100;
function workWithIt(){
    shared += 100;
}

setTimeout(workWithIt, 500);
setTimeout(workWithIt, 500);

Idealmente, esse trecho de código deve adicionar 200 à variávelshared, que é 300 depois.

Mas, como eu sei dec, pode haver algumas implicações, se a operação + = for dividida em vários comandos.

Digamos que esta é a ordem de execução da função:

setTimeout() --> create Thread A
setTimeout() --> create Thread B
wait 500ms

      **Thread A**              |        **Thread B**
--------------------------------+---------------------------------
var tmpA = shared;  //100       |
                                |   var tmpB = shared; //100
                                |   tmpB = tmpB+100;   //tmpB=200
                                |   shared = tmpB;
tmpA = tmpA+100;    //tmpA=200  |
shared = tmpA;                  |

Nesse caso,shared agora tem o valor 200.

Isso pode acontecer em muitas linguagens de programação como c, c ++, java, c #, ... - mas também pode acontecer em Javascript?

Ou, de maneira mais geral: como o Javascript lida com seus threads, quando ele alterna entre threads e existem métodos internos que podem ser usados para lidar com as condições de corrida?

questionAnswers(2)

yourAnswerToTheQuestion