в похожей ситуации я реализовывал семафор следующим способом
if(localstorage['имя_семафора']++>1)
{ // значит этот семафор уже кто то занял,
localstorage['имя_семафора']--;
// ждем некоторое время и повторяем попытку
} else
{ // никто семафор не занял можно работать
...
// по окончанию работы семафор надо освободить
localstorage['имя_семафора']--;
}
смысл в том что localstorage[]++ это атомарная операция (
вот в этом месте я скорее всего не прав), а благодаря тому что единственная опасная операция, которая могла бы вклиниться между работай с localstorage и if - это --, и она проихойдет когда семафор и так должен освободиться, т.е. проблем это не создаст.
p.s. почему говорю семафор а не мьютекс, потому что можно сравнивать не только с 1 но и большим числом - это определит, сколько одновременно можно ресурс занимать
p.p.s. в интернете гуляет реализацию мьютекс на javascrit как раз на localstorage но она какая то переусложненная и я не понимаю зачем
если кто то по умнее, объясните пожалуйста