Problemas com concorrencia. synchonized nao esta surtindo efeito

Galera,

estou com o seguinte problema de concorrência.

Tentamos assinar toda o método com o synchronized (sei que nao é a melhor forma, pois honera muito o processamento) mas mesmo assim não funciona. As duas chamadas estão entrando ao mesmo tempo e embaralhando o array de indices que estava sendo formado. E assim acabo numa exception do tipo IndexOutOfBound.

Para tentar melhorar a perfomance tentei criar alguns blocos de synchronized nas regiões que considerava críticas.

Esse é uma parte do código um dos métodos que estamos tentando sincronizar.

public boolean gerarXML() {

            

            listaGuias = null;

            numeroLote = "";

            

            String codigo = "";

            String tipoGuia = "";

            String numerofatura = "";

            

            TissGuiaLote guiaLote = null;

            FuncsDBBean funcs = null;

            

            try {

                  

                  sql = " select mi.cod_internamento codigo, f.cod_fatura,
f.tip_fatura, f.num_nf,"

                        +" case when (i.tip_internamento = 'E' and
i.cod_local in (104,158) and i.tip_consulta in ('P','S')) then"

                        +"     'CONSULTA_INTERNO'"

                        +" else case when (i.tip_atendimento in
('T','P','E','N','A','H')) then"

                        +"            'SADT_INTERNO'"

                        +"      else "

                        +"            'RESUMO_INTERNACAO'"

                        +"     end"

                        +" end tipo_guia"

                        +" from fatura f,"

                        +" marca_inter mi,"

                        +" internamento i,"

                        +" nota_fiscal_fatura nff"

                        +" where"

                        +" f.cod_fatura in ("+retornaCodFaturas()+")"

                        +" and mi.cod_fatura = f.cod_fatura"

                        +" and i.cod_internamento = mi.cod_internamento"

                        +" and nff.num_nf = f.num_nf"

                        +" and f.tip_fatura = 'I'"

                        +" union all"

                        +" select distinct ir.cod_requisicao codigo,
f.cod_fatura, f.tip_fatura, f.num_nf,"

                        +" case when (r.tip_atendimento in ('P','S','N'))
then "

                        +"     'CONSULTA_EXTERNO'"

                        +" else "

                        +"     'SADT_EXTERNO'"

                        +" end tipo_guia"

                        +" from fatura f,"

                        +" item_requisicao ir,"

                        +" requisicao r,"

                        +" nota_fiscal_fatura nff"

                        +" where"

                        +" f.cod_fatura in ("+retornaCodFaturas()+")"

                        +" and ir.cod_fatura = f.cod_fatura"

                        +" and r.cod_requisicao = ir.cod_requisicao"

                        +" and nff.num_nf = f.num_nf"

                        +" and f.tip_fatura = 'E'"

                        +" order by codigo";

                  

                  rs=stmt.executeQuery(sql);

                  

                  listaGuias = new ArrayList();

                  

                  funcs = new FuncsDBBean();

                  

                  while(rs.next()) {

                        

                        if(rs.isFirst()) {

                             num_nf = rs.getString("NUM_NF");

                        }

                        

                        codigo = rs.getString("CODIGO");

                        tipoGuia = rs.getString("TIPO_GUIA");

                        numerofatura = rs.getString("COD_FATURA");

                        

                        if(tipoGuia.equalsIgnoreCase("RESUMO_INTERNACAO")) {

                             if (funcs.isInternamentoPacotePPP(codigo)) {

                                   tipoGuia =
"RESUMO_INTERNACAO_PACOTE_PPP";

                             } else {

                                   if(funcs.isInternamentoPacote(codigo)) {

                                         tipoGuia =
"RESUMO_INTERNACAO_PACOTE";

                                   } else {

                                         tipoGuia =
"RESUMO_INTERNACAO_NORMAL";

                                   }

                             } 

                        }

                        

                        guiaLote = new TissGuiaLote();

                        

                        guiaLote.setCodigo(codigo);

 
guiaLote.setEstrategia(TissTipoGuiaLoteV20103.obterEstrategiaPorTipoGuia(tip
oGuia));

 
guiaLote.setTipoGuia(TissTipoGuiaLoteV20103.obterTipoGuiaTiss(tipoGuia));

 
guiaLote.setTipoConta(TissTipoGuiaLoteV20103.obterTipoContaPorTipoGuia(tipoG
uia));

                        guiaLote.setNumeroFatura(numerofatura);

                        

                        listaGuias.add(guiaLote);

                  }

                  

                  List listaInformacoesGuias = new ArrayList();

                  String[] parametrosQuery = null;

                  

                  Iterator itListaGuias = listaGuias.iterator();

 

                  while (itListaGuias.hasNext()) {

                        

                        guiaLote = (TissGuiaLote) itListaGuias.next();

                        

                        if(guiaLote.getEstrategia() instanceof
EstrategiaConstrucaoGuiaConsultaAB) {

                             

                             parametrosQuery = new
String[]{guiaLote.getCodigo()};

                             

                             InformacoesGuiaConsulta infoGuiaConsulta =
TemplateInformacoesGuiasV20103.getInformacoesGuiaConsulta();

                             

 
setInformacoesPersonalizadasGuiaConsulta(cod_equipe_empresa,
infoGuiaConsulta);

                             

 
infoGuiaConsulta.setEstrategia(guiaLote.getEstrategia());

 
infoGuiaConsulta.setParamQueryIdentificacaoGuia(parametrosQuery);

 
infoGuiaConsulta.setParamQueryDadosBeneficiario(parametrosQuery);

 
infoGuiaConsulta.setParamQueryDadosContratado(parametrosQuery);

 
infoGuiaConsulta.setParamQueryProfissionalExecutante(parametrosQuery);

 
infoGuiaConsulta.setParamQueryHipoteseDiagnostica(parametrosQuery);

 
infoGuiaConsulta.setParamQueryDadosAtendimento(parametrosQuery);

 
infoGuiaConsulta.setParamQueryDadosAvulsos(parametrosQuery);

                             

                             listaInformacoesGuias.add(infoGuiaConsulta);

                        

                        } else {

                             

                             if(guiaLote.getEstrategia() instanceof
EstrategiaConstrucaoGuiaSPSADTAB) {

                                   

                                   parametrosQuery = new
String[]{guiaLote.getCodigo()};

                                   

                                   InformacoesGuiaSPSADT infoGuiaSPSADT =
TemplateInformacoesGuiasV20103.getInformacoesGuiaSPSADT();

                                   

 
setInformacoesPersonalizadasGuiaSPSADT(cod_equipe_empresa, infoGuiaSPSADT);

                                   

 
infoGuiaSPSADT.setEstrategia(guiaLote.getEstrategia());

 
infoGuiaSPSADT.setParamQueryIdentificacaoGuiaSADTSP(parametrosQuery);

 
infoGuiaSPSADT.setParamQueryDadosAutorizacao(parametrosQuery);

 
infoGuiaSPSADT.setParamQueryDadosBeneficiario(parametrosQuery);

 
infoGuiaSPSADT.setParamQueryDadosSolicitante(parametrosQuery);

 
infoGuiaSPSADT.setParamQueryPrestadorExecutante(parametrosQuery);

 
infoGuiaSPSADT.setParamQueryDiagnosticoGuia(parametrosQuery);

 
infoGuiaSPSADT.setParamQueryProcedimentosRealizados(parametrosQuery);

 
infoGuiaSPSADT.setParamQueryEquipePorProcedimento(parametrosQuery);

 
infoGuiaSPSADT.setParamQueryOutrasDespesas(parametrosQuery);

 
infoGuiaSPSADT.setParamQueryOPMUtilizada(parametrosQuery);

 
infoGuiaSPSADT.setParamQueryDadosAvulsos(parametrosQuery);

                                   

 
listaInformacoesGuias.add(infoGuiaSPSADT);

                             

                             } else {

                                   

                                   if(guiaLote.getEstrategia() instanceof
EstrategiaConstrucaoGuiaResumoInternacaoAB) {

                                         

                                         parametrosQuery = new
String[]{guiaLote.getCodigo()};

                                         

                                         InformacoesGuiaResumoInternacao
infoGuiaResumoInternacao =
TemplateInformacoesGuiasV20103.getInformacoesGuiaResumoInternacao();

                                         

 
setInformacoesPersonalizadasGuiaResumoInternacao(cod_equipe_empresa,
infoGuiaResumoInternacao);

                                         

 
infoGuiaResumoInternacao.setEstrategia(guiaLote.getEstrategia());

 
infoGuiaResumoInternacao.setParamQueryIdentificacaoGuiaResumoInternacao(para
metrosQuery);

 
infoGuiaResumoInternacao.setParamQueryDadosBeneficiario(parametrosQuery);

 
infoGuiaResumoInternacao.setParamQueryIdentificacaoExecutante(parametrosQuer
y);

 
infoGuiaResumoInternacao.setParamQueryDadosAutorizacao(parametrosQuery);

 
infoGuiaResumoInternacao.setParamQueryInternacaoObstetrica(parametrosQuery);

 
infoGuiaResumoInternacao.setParamQueryDeclaracoesNascidosVivos(parametrosQue
ry);

 
infoGuiaResumoInternacao.setParamQueryDiagnosticoSaidaInternacao(parametrosQ
uery);

 
infoGuiaResumoInternacao.setParamQueryProcedimentosRealizados(parametrosQuer
y);

 
infoGuiaResumoInternacao.setParamQueryEquipePorProcedimento(parametrosQuery)
;

 
infoGuiaResumoInternacao.setParamQueryOPMUtilizada(parametrosQuery);

 
infoGuiaResumoInternacao.setParamQueryOutrasDespesas(parametrosQuery);

 
infoGuiaResumoInternacao.setParamQueryDadosAvulsos(parametrosQuery);

                                         

 
listaInformacoesGuias.add(infoGuiaResumoInternacao);

                                   }

                             }

                        }

                  }

                  

                  sql = "select sec_tiss_envio_lote.nextval num_lote from
dual";

                  

                  rs = stmt.executeQuery(sql);

                  

                  if(rs.next()) {

                        numeroLote = rs.getString("NUM_LOTE");

                  }

                  

                  TissVersaoAtualV20103.setVersaoAtual();

                  

                  BuilderLoteGuiasTISSAdapterV20103 builder = new
BuilderLoteGuiasTISSAdapterV20103(numeroLote,listaInformacoesGuias);

                  

                  InformacoesCabecalhoTransacao infoCabecalhoTransacao =
TemplateInformacoesGuiasV20103.getInformacoesCabecalhoTransacao();

                  

 
setInformacoesPersonalizadasCabecalhoTransacao(cod_equipe_empresa,
infoCabecalhoTransacao);

                  

                  infoCabecalhoTransacao.setParamQueryCabecalhoTransacao(new
String[]{cod_prestador_operadora,cod_equipe_empresa});

                  

                  DiretorMensagemTISS diretor = new
DiretorMensagemTISS(builder, infoCabecalhoTransacao, con, caminhoAplicacao);

                  

                  synchronized (diretor) {

                        diretor.contruirMensagemTISS();

                  }

                  

                  System.out.println("Gerando arquivo xml...");

                  

                  File arquivoXml =
GeradorXML.gerarXML(builder.getMensagemTISS());

                  

                  arq = "transmissao/" +
builder.getMensagemTISS().getCabecalho().getDestino().getRegistroANS() +

                        "/" + arquivoXml.getName();

                  

                  System.out.println("Arquivo gerado com sucesso!!");

                  

                  String[] dataRegistroTransacao =
builder.getMensagemTISS().getCabecalho().getIdentificacaoTransacao().getData
RegistroTransacao().split("/");

                  

                  String data = dataRegistroTransacao[0];

                  String mes = dataRegistroTransacao[1];

                  String ano = dataRegistroTransacao[2];

                  

                  String[] horaRegistroTransacao =
builder.getMensagemTISS().getCabecalho().getIdentificacaoTransacao().getHora
RegistroTransacao().split(":");;

                  

                  String horas = horaRegistroTransacao[0];

                  String minutos = horaRegistroTransacao[1];

                  

                  sql = "insert into tiss_transacao values ("+
builder.getMensagemTISS().getCabecalho().getIdentificacaoTransacao().getSequ
encialTransacao().longValue() +", "

                             + 1 +", to_date(('"+ data

                             +"/"+ mes 

                             +"/"+ ano

                             +"' || ' ' || '"+ horas 

                             +":"+ minutos

                             +"'), 'DD/MM/RRRR HH24:MI'), '"+
builder.getMensagemTISS().getCabecalho().getDestino().getRegistroANS()

                             +"', '"+ arquivoXml.getAbsolutePath() +"','')";


                  

                  stmt.executeUpdate(sql);

                  

                  sql = " insert into tiss_envio_lote_empresa "

                        +" values ("+ numeroLote +", "

                        +
builder.getMensagemTISS().getCabecalho().getIdentificacaoTransacao().getSequ
encialTransacao().longValue()+ ", '"

                        + num_nf + "', " + cod_equipe_empresa + ", '" +
tipo_fatura + "')";

 

                  stmt.executeUpdate(sql);

                  

                  System.out.println("O registro do arquivo enviado foi
inserido com sucesso.");

                  

            } catch (Exception e) {

                  

                  if(e.getMessage().indexOf("Não se pode colocar em um lote
de guias de faturamento mais de um tipo de guia de faturamento") != -1) {

                        guiasDistintas = true;

                  }

                  

                  log("Erro em EnvioLoteTISSV20103:gerarXML()
"+e.getMessage()+"SQL: "+sql);

                return false;

            }

            

            return true;

      }

Tentei tratar com blocos de synchronized dentro deste método que é minha região critica de verdade onde ele embaralha o indice e me encerra o processamento.


protected final void buildEquipePorProcedimento() throws
TissConstrucaoException {

            

            Statement stmt = null;

            ResultSet rs = null;

            

            try {

                  

                  if(listaDadosProcedimentos.size() != 0) {

                        

 
if(FuncoesGerais.queryNaoENula(getQueryEquipePorProcedimento(infoGuiaResumoI
nternacao.getParamQueryEquipePorProcedimento(),listaDadosProcedimentos.get(0
)), false)

                                   &&
FuncoesGerais.naoENulo(infoGuiaResumoInternacao.getParamQueryEquipePorProced
imento())) {

                             

                             int indice = 0;

                             

                             for (DadosProcedimento dadosProcedimento :
listaDadosProcedimentos) {

                                   

                                   stmt = builder.conexao.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );

                                   rs =
stmt.executeQuery(getQueryEquipePorProcedimento(infoGuiaResumoInternacao.get
ParamQueryEquipePorProcedimento(), dadosProcedimento));

                                   

 
CtProcedimentoRealizadoEquipe.Procedimentos procedimento = null;

                                   

                                   synchronized (this) {

                                         procedimento =
guiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get(ind
ice);

                                   }

                                   

                                   while(rs.next()) {

                                         

                                         if(rs.isFirst()) {

                                               procedimento.setEquipe(new
CtIdentificacaoEquipe());

                                         }

                                         

                                         CtIdentificacaoEquipe.MembroEquipe
membroEquipe = new CtIdentificacaoEquipe.MembroEquipe();

                                         

 
membroEquipe.setCodigoProfissional(new CtIdentificacaoPrestadorEquipe());

                                         

 
if(FuncoesGerais.naoENulo(infoGuiaResumoInternacao.getProcedimentosRealizado
s().getProcedimentos().getEquipe().getMembroEquipe().getCodigoProfissional()
.getConselhoProfissional())) {

                                               

 
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCodigoProfissional().getConselhoProfissional()
.getSiglaConselho(), true)) {

 
membroEquipe.getCodigoProfissional().getConselhoProfissional().setSiglaConse
lho(StConselhoProfissional.fromValue(FuncoesGerais.removerEspacosEmBranco(

 
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getCodigoProfissional().getConselhoP
rofissional().getSiglaConselho()))));

                                               }

                                               

 
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCodigoProfissional().getConselhoProfissional()
.getNumeroConselho(), true)) {

 
membroEquipe.getCodigoProfissional().getConselhoProfissional().setNumeroCons
elho(FuncoesGerais.removerEspacosEmBranco(

 
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getCodigoProfissional().getConselhoP
rofissional().getNumeroConselho())));

                                               }

                                               

 
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCodigoProfissional().getConselhoProfissional()
.getUfConselho(), true)) {

 
membroEquipe.getCodigoProfissional().getConselhoProfissional().setUfConselho
(StUF.fromValue(FuncoesGerais.removerEspacosEmBranco(

 
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getCodigoProfissional().getConselhoP
rofissional().getUfConselho()))));

                                               }

                                               

                                         } else {

 
if(FuncoesGerais.naoENulo(infoGuiaResumoInternacao.getProcedimentosRealizado
s().getProcedimentos().getEquipe().getMembroEquipe().getCodigoProfissional()
.getCpf())) {

 
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCodigoProfissional().getCpf(), true)) {

 
membroEquipe.getCodigoProfissional().setCpf(FuncoesGerais.removerEspacosEmBr
anco(

 
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getCodigoProfissional().getCpf())));

                                                     }

                                               } else {

 
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCodigoProfissional().getCodigoPrestadorNaOpera
dora(), true)) {

 
membroEquipe.getCodigoProfissional().setCodigoPrestadorNaOperadora(FuncoesGe
rais.removerEspacosEmBranco(

 
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getCodigoProfissional().getCodigoPre
stadorNaOperadora())));

                                                     }

                                               }

                                         }

                                         

 
membroEquipe.setIdentificacaoProfissional(new CtProfissionalExecutante());

                                         

                                         if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getIdentificaoProfissional().getNomeExecutante(),
false)) {

 
membroEquipe.getIdentificacaoProfissional().setNomeExecutante(FuncoesGerais.
removerEspacosEmBranco(

 
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getIdentificaoProfissional().getNome
Executante())));

                                         }

                                         

 
membroEquipe.getIdentificacaoProfissional().setConselhoProfissional(new
CtConselhoProfissional());

                                         

                                         if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getIdentificaoProfissional().getConselhoProfissio
nal().getSiglaConselho(), true)) {

 
membroEquipe.getIdentificacaoProfissional().getConselhoProfissional().setSig
laConselho(StConselhoProfissional.fromValue(

 
FuncoesGerais.removerEspacosEmBranco(rs.getString(infoGuiaResumoInternacao.g
etProcedimentosRealizados().getProcedimentos().getEquipe().getMembroEquipe()
.getIdentificaoProfissional().getConselhoProfissional().getSiglaConselho()))
));

                                         }

                                         

                                         if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getIdentificaoProfissional().getConselhoProfissio
nal().getNumeroConselho(), true)) {

 
membroEquipe.getIdentificacaoProfissional().getConselhoProfissional().setNum
eroConselho(

 
FuncoesGerais.removerEspacosEmBranco(rs.getString(infoGuiaResumoInternacao.g
etProcedimentosRealizados().getProcedimentos().getEquipe().getMembroEquipe()
.getIdentificaoProfissional().getConselhoProfissional().getNumeroConselho())
));

                                         }

                                         

                                         if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getIdentificaoProfissional().getConselhoProfissio
nal().getUfConselho(), true)) {

 
membroEquipe.getIdentificacaoProfissional().getConselhoProfissional().setUfC
onselho(StUF.fromValue(

 
FuncoesGerais.removerEspacosEmBranco(rs.getString(infoGuiaResumoInternacao.g
etProcedimentosRealizados().getProcedimentos().getEquipe().getMembroEquipe()
.getIdentificaoProfissional().getConselhoProfissional().getUfConselho()))));

                                         }

                                         

                                         if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getIdentificaoProfissional().getCodigoCbos(),
false)) {

 
membroEquipe.getIdentificacaoProfissional().setCodigoCBOS(

 
FuncoesGerais.removerEspacosEmBranco(rs.getString(infoGuiaResumoInternacao.g
etProcedimentosRealizados().getProcedimentos().getEquipe().getMembroEquipe()
.getIdentificaoProfissional().getCodigoCbos())));

                                         }

                                         

                                         if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCpf(), false)) {

 
membroEquipe.setCpf(FuncoesGerais.removerEspacosEmBranco(rs.getString(infoGu
iaResumoInternacao.getProcedimentosRealizados().getProcedimentos().getEquipe
().getMembroEquipe().getCpf())));

                                         }

                                         

                                         if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getPosicaoProfissional(), true)) {

 
membroEquipe.setPosicaoProfissional(rs.getString(infoGuiaResumoInternacao.ge
tProcedimentosRealizados().getProcedimentos().getEquipe().getMembroEquipe().
getPosicaoProfissional()));

                                         }

                                         

 
procedimento.getEquipe().getMembroEquipe().add(membroEquipe);

                                   }

                                   

                                   synchronized (this) {

                                         indice = indice + 1;

                                   }

                                   

                             }

                        }     

                  }

                  

            } catch (Exception e) {

                  throw new
TissConstrucaoException(this.getClass().getSimpleName(),
"buildEquipePorProcedimento" ,"getQueryEquipePorProcedimento", 

 
infoGuiaResumoInternacao.getParamQueryEquipePorProcedimento(),
e.getMessage());

            } finally {

                  try {

                        if ( stmt != null ) {

                             stmt.close();

                        }

                        

                        if ( rs != null ) {

                             rs.close();

                        }

                  } catch (Exception e) {

                        throw new
TissConstrucaoException(this.getClass().getSimpleName(),
"buildEquipePorProcedimento" ,"getQueryEquipePorProcedimento", 

 
infoGuiaResumoInternacao.getParamQueryEquipePorProcedimento(),
e.getMessage());

                  }

            }

      }

Se alguém puder me dar uma luz ou me mostrar o ponto onde estou falhando. Pois o syncronized não está surtindo efeito, ele entra com as duas solicitões mesmo que eu assine o método com o synchronized e ocorre tudo que já expliquei aqui. :frowning: :shock:

Abraços a todos.

Logo de cara já parece haver um problema no seu código:

                   DiretorMensagemTISS diretor = new  
 DiretorMensagemTISS(builder, infoCabecalhoTransacao, con, caminhoAplicacao);  
   
                     
   
                   synchronized (diretor) {  
   
                         diretor.contruirMensagemTISS();  
   
                   }  

Quantos objetos do tipo “diretor” são criados pelo seu código? Um para todas as threads ou um por thread? Dá a impressão (o código é muito comprido e não consegui lê-lo todo) que há um objeto “diretor” por thread; se for isso, nunca haverá sincronização, já que a sincronização por definição envolve várias threads.
“synchronized (this)” (em outra parte do seu código) também não funciona se existir um “this” para cada thread.

[quote=thingol]Logo de cara já parece haver um problema no seu código:

                   DiretorMensagemTISS diretor = new  
 DiretorMensagemTISS(builder, infoCabecalhoTransacao, con, caminhoAplicacao);  
   
                     
   
                   synchronized (diretor) {  
   
                         diretor.contruirMensagemTISS();  
   
                   }  

Quantos objetos do tipo “diretor” são criados pelo seu código? Um para todas as threads ou um por thread? Dá a impressão (o código é muito comprido e não consegui lê-lo todo) que há um objeto “diretor” por thread; se for isso, nunca haverá sincronização, já que a sincronização por definição envolve várias threads.
“synchronized (this)” (em outra parte do seu código) também não funciona se existir um “this” para cada thread.
[/quote]

Thingol, obrigado pela resposta.

É assim… na verdade é criada um objeto do tipo “diretor” por chamada ao processo.

Nós estamos fazendo testes simultâneos através do browser e queremos impedir que o método construirMensagemTiss da clase diretor seja executado ao mesmo tempo. Por isso tentamos fazer dessa forma mostrada abaixo:

synchronized (diretor) {  
   
                         diretor.contruirMensagemTISS();  
   
                   }  

Mas, ainda sim ele permite a chamada dupla e depois embaralha meu indice do array.

:frowning:

Aham, ainda assim quero saber quantos objetos dessa classe estão instanciados em um determinado momento. Essa classe roda em um servlet, um EJB, onde?

[quote=thingol]
Aham, ainda assim quero saber quantos objetos dessa classe estão instanciados em um determinado momento. Essa classe roda em um servlet, um EJB, onde?[/quote]

Roda num servlet.

Apenas um objeto está sendo instanciado para essa classe neste momento.
Para cada vez que alguém faz uma nova chamada ele dá um new e cria uma nova referência.

Thingol, desculpe mas não sei se estou conseguindo ser claro em minhas dúvidas.

Eu na verdade estou fazendo um monte de perguntas, sem ver (ou entender) exatamente os detalhes do seu problema, esperando que você é que consiga resolvê-lo (método “socrático”).

  1. Se você está usando uma servlet, normalmente as servlets são multithreaded (ou seja, apenas uma instância da classe derivada de HttpServlet é criada por web container). Veja se por engano você não especificou (no web.xml) que a servlet é “single-threaded” (ou seja, uma instância da classe servlet é criada por requisição). Se você fez isso (usou “single-threaded” em vez de “multi-threaded”), aí fica mais complicado. Certifique-se que sua servlet é “multithreaded”.
  2. Se para cada requisição você está criando um novo objeto Diretor, então você não pode sincronizar sobre esse objeto Diretor; você tem de sincronizar por algum campo do objeto servlet - já que há apenas um objeto desses, não?
    Você pode até criar um objeto como campo do objeto servlet (mais ou menos assim: Object lock = new Object():wink: só para sincronizar por ele.)
  3. Nem olhei o que o “this” representava - não olhei direito seu código.

Thingol

Tivemos que alterar a declaração de nosso método para static synchornized e fizemos a seguinte alteração em um trecho que chama o método que vai chamar a região crítica, como:


//criamos uma instancia de Object
Object o = new Object();

public boolean execRel(){
        synchornized (o){
             return gerarXML();
        }

}

E no final do método gerarXML demos um notify() para liberar o processo.

Vemos que ainda não é a melhor solução para o caso, pois o processo da geração do XML é muito custoso e da forma que está sendo feita agora ele espera todo o processo terminar para começar o próximo.
Estamos de imediato tentando diminuir o processamento disso, pois dessa forma ele fica o tempo todo testando até que chegue a notificação, quero achar um tempo ideal para que eu consiga dar um wait nele e diminuir essa quantidade de testes.

E, também, a forma mais correta de utilizar o wait nesse caso.

Tentamos tirar esse tratamento daí e colocar algo semelhante dentro da nossa lib (que é onde cai na região crítica, porém lá da erro e o synchronized não funciona. Por isso, até agora estamos tendo que arcar com esse ônus de esperar um processamento para começar o outro.

Obrigado pela ajuda e pelo método de ensino “socrático” … (risos)… Muito boa prática.