Olá a todos.
Eu entendo o funcionamento de threads e métodos atômicos (synchronized). Mas tenho dúvida quando o assunto é site desenvolvido em java, pois em nenhum momento criamos threads na mão. Como funcionam as threads nesse caso? Cada janela ou aba aberta no navegador é uma thread? Então cada usuário(cliente) pode ter várias threads rodando se abrir várias janelas/abas?
Por exemplo. Tenho um e-commerce feito em java (com struts). Quando um cliente compra um produto, tenho que reduzir a quantidade no estoque. Vamos supor que tenho 4 canetas disponíveis no estoque. O cliente A coloca 3 canetas no carrinho de compras, o cliente B coloca 2. O cliente A vai finalizar o pagamento. Entra no método que primeiro verifica se realmente existem 3 canetas no estoque, e existem. Nesse momento ele dorme (se for uma thread). Mas então o cliente B decide finalizar a compra também e acessa o mesmo método, que verifica se existem 2 canetas no estoque, e existem, porque o cliente A dormiu antes de subtrair as 3 canetas do estoque. O cliente B dorme. O cliente A acorda e finaliza a transição, retirando as 3 canetas do estoque. Nesse momento o cliente B também acorda e retira mais 2 canetas do estoque, que ficará com -1, pois só havia 4 canetas e foram retiradas 5.
Se for isso mesmo, então o certo é eu criar um método synchonized na Action que confere o estoque e reduz a quantidade, certo? E ainda mais, esse método tem que ser static? Pois se não for static, como a Action do Struts é tratada como um novo objeto a cada requisição, o método synchonized não será tratado como atômico, certo?