Один из вариантов использования спин-блокировок - если вы ожидаете очень низкую конкуренцию, но их будет много. Если вам не нужна поддержка рекурсивной блокировки, спин-блокировка может быть реализована в одном байте, а если конфликт очень низкий, то потери в цикле ЦП незначительны.
Для практического использования у меня часто есть массивы тысяч элементов, где обновления для различных элементов массива могут безопасно происходить параллельно. Шансы двух потоков на одновременное обновление одного и того же элемента очень малы (низкая конкуренция), но мне нужен один замок для каждого элемента (у меня их будет много). В этих случаях я обычно выделяю массив ubytes того же размера, что и массив, который я обновляю параллельно, и реализую встроенные спин-блокировки (на языке программирования D):
while(!atomicCasUbyte(spinLocks[i], 0, 1)) {}
myArray[i] = newVal;
atomicSetUbyte(spinLocks[i], 0);
С другой стороны, если бы мне пришлось использовать обычные блокировки, мне пришлось бы выделить массив указателей на объекты, а затем выделить объект Mutex для каждого элемента этого массива. В сценариях, подобных описанному выше, это просто расточительно.