Dúvida OCWCD

Pessoal estou com um dúvida que obtive lendo o livro Servlets & JSP .

minha dúvida é se os atributos da Sessão são Thread-safe (Obs: eu sei que não são, só não intendi o porque)…

Bom sabemos que cada solicitação do cliente que chega no Container ele cria uma Thread para rodar o “serviço”, Sim só para executar o serviço pois o Servlet é unico.

Agora minha dúvida, no livro na pagina 198 ele fala que atributos da Sessão são Thread-safe usando a MESMA janela.

R: Blz . um cliente só pode pertencer a uma solicitação por vez , mais imagine o seguinte cenário usando a mesma janela do browser (OBS: Em janelas diferente eu intendi porque eles não são thead safe).

Eu , em uma tela de cadastro de pessoas informo os dados e aperto um submit para o Servlet A.

 O container recebe a solicitação e cria um thread A para o Servlet A . (Blz, ele criou uma solicitação "por vez" , até aqui tranquilo).

Porem, eu achei que o dados não tinha sido enviados e apertei o submit novamente

Aqui o container recebe a solicitação e cria um thread B para o Servlet A , nesse momento imagine que a Thread A não tinha terminado de rodar o metodo de serviço ainda e a Thread B assume este metodo deixando os dados inconsistente.

isso não seria a conclusão que mesmo usando a mesma janela eles não são thead safe?

É isso?

Um cliente pode fazer várias solicitações:

e.g. Múltiplas abas no navegador
Chamadas assíncronas
Um cliente HTTP qualquer pode fazer isso

A sessão não é thread-safe e isso significa que você não deve confiar nesse comportamento.

[quote]Aqui o container recebe a solicitação e cria um thread B para o Servlet A , nesse momento imagine que a Thread A não tinha terminado de rodar o metodo de serviço ainda e a Thread B assume este metodo deixando os dados inconsistente.

isso não seria a conclusão que mesmo usando a mesma janela eles não são thead safe? [/quote]
A partir do momento que existem múltiplas requisições não existe garantia que que a sessão é thread-safe. “e um único cliente só pode pertencer a uma solitação por vez”, tens outra referência pra isso? já tentou ler a versão original do livro?

Primeiramente obrigado pela resposta

No livro ele fala que se usar a mesma Janela seus atributos são thead-safe

Sim, o livro original fala a mesma coisa … mais eu não intendi muito bem …

o que você acha desse pensamento que eu tive

Na verdade não, não é thread-safe. Na mesma janela ele usa a mesma sessão, portanto o objeto session pode ser alterado de forma não thread-safe.

O que ocorre é o seguinte: As sessões são objetos identificados para cada usuário (navegador no caso), imagine a situação: Existe um usuário A no firefox e um usuário b no chrome… Cada um seria uma sessão diferente, dessa forma, um não influencia na sessão do outro, certo? Assim o escopo de um não interfere no outro. São duas coisas (objetos) independentes um do outro.

Contudo, Se o usuário A, por ventura, mandar duas solicitações (requisições) que possam ser concorrentes entre si (por ex em abas diferentes no navegador), elas podem sim alterar o objeto session pertencente ao Usuário A (ou seja, ele mesmo). PS: Isso aí não importa para o usuário B, pois ele está em outra sessão.

No caso, o usuário A cria duas requisições (threads) que podem alterar a sua session. Lembre-se a session é única por usuário.

Pra contornar isso é necessário dar um lock no HttpSession. (bloco synchronized) tipo isso:

synchronized(session) {
session.setAttribute("foo", "22");
session.setAttribute("bar","42");
out.println(session.getAttribute("foo"));
out.println(session.getAttribute("bar")); 
}

[quote]Em off eu pensei o seguinte, a não ser que quando livro falou (“e um único cliente só pode pertencer a uma solitação por vez”) a solicitação da Thread B só começa quando terminar a solicitação da Thread A… mais isso referênte ao mesmo clientes, em clientes diferêntes as requisições continua…
[/quote]

Não, como o Jairo Junior explicou, um cliente pode enviar um monte de solicitações ao mesmo tempo:

Não sei se consegui ser bem claro, se eu tiver explicado errado alguma coisa, peço que me desculpem. :smiley:

e no livro ele tbm fala

Então o livro está errado? minha dúvida principal é essa…

Sim por abas diferente no navegado o livro fala que realmente NÃO é thead-safe isso eu intendi, e como resolver…tranquilo isso.

Qual página você viu isso? Deixa eu dar uma olhada aqui.

No primeiro post eu cito a pagina… é a 198 bem no inicio…

Na pág 198 você fala disso né:

Só que ele diz depois:

O autor só fez uma espécie de questionamento a se pensar. Ele não afirmou, ele apenas se perguntou isso.
Depois ele fala assim na conversa dos mestres do kung fu na pag 199, dando a resposta para a pergunta que ele fez a si mesmo anteriormente:

edit

É exatamente isso…

Aqui …

Ele afirma que os atributos da sessão NÃO thread-safe SE o cliente abrir um nova aba… tudo bem…belezinha…

Mais e aqui… o ponto é exatamente esse

Mas se é um cliente - e um único cliente só pode pertencer a uma solicitação por vez isso ele afirma no livro não é!!?

eu não intendi essa afirmação…

no restante…

isso automaticamente já não significa que as sessões sejam thread-safe? Ou seja, mesmo que vários servlets estejam envolvidos, seja qual for o momento,só haverá uma solicitação de cada cliente… então, apenas uma thread estará rodando naquela sessão. Certo?

o que ele comentou aqui… é apenas um questionamento ?.. se simm … ele não explica o porque… no livro ele só justifica quando se usa mais de uma janela no browser… veja

[b]- O cliente poderia abrir uma nova janela no browser!

  • O Container pode ver a solicitação da segunda janela como se viesse da mesma sessão.
  • Logo, os atributos de Sessão não são thread-safe e eles também devem ser protegidos. [/b]

mais sobre a mesma janela ele só deixa aquele questionamento…

Eu acho que sua dúvida pode ser tirada da seguinte maneira. Imagine que seu atributo de sessão seja um carrinho de compras. Aí você está logado no sistema e abre duas páginas: uma das páginas limpa o carrinho de compras e a outra insere mais um item nesse carrinho (um exemplo bem chulo). O cliente está na mesma sessão e dispara a requisição das duas páginas ao mesmo tempo. Qual será o resultado final? O carrinho de compras estará limpo ou haverá mais um item nele? Claro que essa é uma situação em que não causaria grandes problemas. Mas só para mostrar que um atributo de sessão pode ser modificado e trazer consequências inesperadas dependendo do contexto.

rsrsrs

douglas_vidotto eu concordo com vocês eu intendi isso. a questão e que o livro fala o contrario rsrs…

o que eu não intendi foi porque um único cliente só pode pertencer a uma solicitação por vez … nessa afirmação da pagina 198 do livro

[quote=erickfm8]Mas se é um cliente - e um único cliente só pode pertencer a uma solicitação por vez, isso automaticamente já não significa que as sessões sejam thread-safe
[/quote]

Foi só uma questão didática ele ter escrito isso. Ele escreveu isso apenas para fazer o leitor pensar, aí depois ele dá a resposta certa. O autor escreveu isso só pra isso mesmo. Ele não afirma isso, ele questiona-se apenas. Ele foi quase um filósofo ai. kkk ser ou não ser thread-safe :D.

Para mim o que o autor quis dizer foi o seguinte: um cliente, mesmo enviando várias solicitações (ou requisições) para a mesma página que realiza algum tratamento em um atributo de sessão, é o cliente de todas elas, MAS, são solicitações diferentes uma da outra. Uma solicitação é uma chamada GET, POST, etc, que envia algo ao servidor e este retorna uma resposta e só! Fim da solicitação. É uma relação um para um. Ou seja, apesar de ser o mesmo cliente em todas as solicitações, elas serão tratadas separadamente pelas threads do servlet.

andersonlandim obrigado pela ajuda…

só que como eu falei a “resposta certa” que ele dá é apenas referente a solicitações de janelas diferentes… intendeu?

e nessa parte

Não me parece um questionamento, aqui ele esta afirmando algo… depois ele questiona, mais essa frase ele afirma que o cliente só pode pertencer a uma solicitação por vez…

douglas_vidotto agredeção a atenção tbm… mais eu não acredito q seja isso , ateé que me provem o contrario rsrs

Grato galera

Pessoal, desculpa “reabrir” este tópico, mais é a ultima vez que leio está pagina do livro antes da prova.

Eu sei que atributos de sessão nao são threads-safe, consegui resolver as questoes dos simulados sobre esse assunto da OCWCD e tals…

Mais não consegui intender ainda os conceitos do livro, apenas 'aceitei" para fazer a prova, mais gostaria que alguem ajudasse a esclarecer isso.

Bom eu intendi que os atributos não são threads-safe usando abas diferentes. NÃO VAMOS BATER EM CIMA DISSO.

O ponto é que não intendi o porque os atributos SÃO threads-safe usando a mesma janela…
ao menos é o que o livro fala… a não ser que ele esteja errado.

pag 198, novamente rsrs

isso foi um questionamento do livro… blz eu intendi.

Agora isso foi uma afirmação do livro

E se em uma tela de cadastro de pessoas (NA MESMA JANELA ) eu informo os dados e aperto varios submit para o Servlet A.

isso vai gerar varias solicitações para o mesmo cliente…

iae?? vai dar problema de concorrencia na mesma janela…

reforçando na pagina 199.

depois ele explica que um cliente pode fazer mais de uma solicitação por vez MAIS usando janelas diferentes…

iae o livro esta errado?