o q é esse synchronized??
pelo o q eu percebi, nao é tipo de dados…
entao é o q entao?
valeu!
o q é esse synchronized??
pelo o q eu percebi, nao é tipo de dados…
entao é o q entao?
valeu!
A palavra-chave synchronized não permite que mais de uma thread acesse um bloco de código ou um método ao mesmo tempo… Por exemplo, quando vc define que um método é synchronized, e este método está sendo executado, o objeto é bloqueado e nenhum outro método synchronized pode ser executado até o anterior ser finalizado. O mesmo serve para blocos de código synchronized… blz?
hmm…
deixa ver se eu entendi…
eu crio um metodo q pode ser acessado por varias classes…
por exemplo, uma aplicação servidora…
aí tem varios clentes q se conecta a esse servidor…
e por exemplo, esse método q tem a propriedade synchronized tem a função de fazer o cliente se conecar com uma outra classe da aplicação…
entao, só terá um cliente por vez acessando o médoto por vez??
se for isso, legal! pq eu posso manter os clientes conectado ao servidor, num tipo de “sala de espera” enquanto só 1 por vez pode ter acesso a classe q é chamada pelo método protegido?
mais uma duvida… se o metodo está bloqueado no momento e alguem tenta executa-lo, o q acontece? dispara uma exception??
vlw!
Bem vamos pegar um exemplo que tem aqui mesmo no portal java:
public sinchronyzed void Transfere(int de, int para, int quantidade) {
while(conta[de] < quantidade) {
try {
wait():
}catch(InterruptedException e) {}
}
conta[de] - = quantidade;
conta[para] + = quantidade;
transfere++;
if(transfere % 5000 = = 0)
teste();
notify();
}
synchronyzed tem tudo have com semafores que o SO usa.
quando vc colaca um synchronyzed na declaração de uma funcao isso quer dizer que esta funcao deve ser executada como um bloco unico ou seja ela nao permite que no meio de sua execuçao o processador seja chaveado para outra funcao assim evitando no caso do exemplo acima que a transaçao bancaria seja feita pelas metades.
outros metodos interessantes que são usados em conjuntos com o synchronized são o wait e notify() o wait coloca a thread para esperar e o notify coloca a thread para rodar. no exemplo acima se nao há dinheiro suficiente na conta origem a thread e posta em espera até que a conta tenha dinheiro suficiente. e quando a transaçao é terminada se observa um notify que seginifica que se deve colocar uma thread que estava esperando para rodar. resumindo tudo isso é para garantir que as operacao deposito e retira sejam executadas sem qualquer interferencia! pois se isso nao acontecesse com certeza teria conta com depositos aindevidos e contas com retiradas indevidas.
Isto é uma das tecnicas mais importantes da computaçao tanto que todo o SO moderno oferece system call para manipulacao de semaforos. Bancos de dados trabalham muito com isso tambem.
[quote]mais uma duvida… se o metodo está bloqueado no momento e alguem tenta executa-lo, o q acontece? dispara uma exception??
[/quote]
Quando isso acontece a thread é colocada na fila de espera do S.O. ou seja fica em Wait. como se fossem processos. De uma estudada em Sistemas Operacionais e vc vai ver a infinidade de aplicaçoes para isso!
Obs. Synchronized é um artificio de alto nivel no fundo no fundo a API java usa os semaforos e monitores do SO.
valeu cara!
mas assim, e se eu quiser colocar um mensagem de alert se o método está bloqueado??
tem alguma funcão tipo inSynchronized() q retorna true ou false indicando se ta bloqueado ou nao??
cara talvez tenha jeito mas isso exigiria programação a nivel de SO pois que controla esse escalonamento é o SO.
mas vc pode fazer uma especie de ganbiarra! crie uma variavel flag e verifique se ela é True ao entrar na sua subrotina se ela for False vc entra na subrotina e lá dentro seta ela como True e quando terminar a funcao vc volta o flag para false. ou seja flag = True alguma thread está executando flag = false nenhuma thread está executando. Esse setaçao do flag vai ter que ser feita em um codigo synchronized por isso que é meio desajeitado mas funcionará!
mas pra fazer essa gambiarra, eu teria q ssaber se a thread está em execução… pra poder retornar o valor false qdo tiver liberado…
tem como?
pra saber se a thread está em execução, use o método isAlive()
soooohhhh!!!
era disso q eu precisava!
valeu cara!