seguinte…tenho um metodo q eh usado por mtas outras classes…
o retorno do metodo eh uma matriz com alguns dados e o ultimo campo contem um dado q dependendo do valor dele, impede o usuario de fazer uma operacao…
o problema eh q estah ficando algum tipo de lixo na variavel, pois o metodo devolve os dados corretos, mas esse ultimo campo vem com dado errado, como se tivesse ficado um resto de outra chamada…o mais estanho eh q, embora a variavel seja de classes, qdo entra no metodo chamo outro metodo q inicializa todas as variaveis…
alguem poderia ajudar, pois com esse problema necessito ficar parando e iniciando o tomcat para limpar tudo…
Você pode estar tendo problemas devido à sincronização de acessos no servlet, envie sua classe para que possamos dar uma olhada (ou pelo menos os trechos de código que inicializam e lidam com este vetor).
[]s
Carlos H
R
rbarioni
bom, tentando esclarecer um pouco as coisas…
chamo esse metodo na classe clsCalculaTempo:
publicstaticint[][] calculaIntervalo(int pintChProg, int pintChProf, int pintChEst, int pintChFas, Timestamp ptsInicio, Timestamp ptsTermino){String[][] strCalcTempo = new String[500][10];//armazenaamatrizretornadadometodocalculaTempostrCalcTempo=calculaTempo(pintChProg, pintChProf,pintChEst,pintChFas,ptsInicio,ptsTermino);
esse metodo chama o metodo calculaTempo q devolve a matriz com os dados…mas como podem ver a matriz eh iniciada toda vez q entra no metodo…
seguinte, pelo que vi as classes Strins[][] dentro de incializar tambem são estaticas (levando em concideracao que eles nao sao declaradas dentro do metodo)
bom, o q aconteceria se algum usário acessasse essas funcoes antes de outro usuário terminar de usa-las? resp.: os valores se misturariam
R
rbarioni
entao…
uma coisa q percebi eh q onde ocorre o problema eh q chamo direto o metodo, sem instanciar a classe…
isso nao mudaria em nada seu problemas, pois os metodos e variaveis continuariam sendo statics…
ou voce retira o statics de tudo ou sincroniza o acesso (mais complicado)
sincronyzed(this){// chama os metodos}
mas nesse caso tem que elaborar melhor
C
Carlos_H
Uma coisa eu não entendi: porque a string precisa ser estática?
Aliás, mesmo retirando o modificador static, lembre-se que precisará sincronizar o acesso mesmo assim! Pois o container servlet pode utilizar uma mesma instancia para diversos clientes web, assim… a mesma variável seria compartilhada entre vários!
[]s
Carlos H.
R
rbarioni
mas Carlos…
nao posso deixar esse metodo sincronizado…ele eh acessado muitas vezes…
sincronizando o metodo, poderia causar uma demora nas operacoes do sistema, certo?? nao sei se seria interessante…
valew
C
Carlos_H
Certo, mas aí é que mora o perigo, afinal, se ele é lido/escrito por diversas threads simultaneamente, você corre o risco de ter informações corrompidas.
Lembre-se também que você não precisa sincronizar um método completo, mas apenas um trecho de código
synchronized(meuObjeto){// código}
Assim você otimiza o código mantendo apenas aquele trecho específico sincronizado.
cv1
rbarioni, 5 coisas que vc precisa fazer nesse codigo:
Reduzir o numero de parametros (encapsulando mais dados em objetos)
Remover as atribuicoes a null, que nao servem pra nada
Tirar os statics (que estão causando o seu problema)
Usar mais objetos ao inves de ter 80% dos dados em String[][] (“stringificação” é algo muito perigoso no design)
Usar um padrão de nomes para variáveis decente. Isso tá parecendo código de 1975, escrito em PL/I, onde a galera achava bonito não ter vogais nos nomes de variáveis
Sobre o problema da stringificação, tem um artigo muito bacana escrito na DeveloperWorks sobre isso:
cv, jah tirei todos os static da classe, mas mesmo assim, de vez em qdo acontece o mesmo problema…
qual o problema com os nomes de variaveis?? os nomes dizem os q as variaveis armazenam, oras…
jogamos null nas variaveis p/ assegurar q nao sera atribuido nada mesmo no inicio das variaveis…p/ garantir q sao nulas antes de receberem valores…
caiofilipini
Mas se essas variáveis são atributos de uma classe, elas já recebem null por padrão…
R
rbarioni
como eu disse, caio…eh mais uma confirmacao de inicializacao das variaveis…
isso nao traz problema algum…nao tenho problema de NPE…
o problema q ocorre eh em um campo da matriz, em algumas situacoes…mas ainda nao conseguimos definir qdo isso ocorre…
caiofilipini
Não é recomendável confiar nessa inicialização padrão?
R
rbarioni
nesse caso, nao Caio…pois esse eh um metodo fundamental p/ o funcionamento do sistema…
caiofilipini
Ok, rbarioni. Valeu pela força!
[]'s
dukejeffrie
Tipo, tá na cara que falta uma sincronizacao nisso aih. O sintoma de acesso indevido é justamente esse: parte dos dados corresponde a uma thread, parte dos dados à outra.
Se vc nao quer sincronizar nas matrizes, ainda mais pq vc vai querer dados diferentes mesmo, vc pode usar ThreadLocal. Mas tem que saber o que está fazendo.
De qq forma, vc pode pedir como argumento a matriz. Isso tb garante que cada request vai criar a sua e uma nao vai interferir na outra.