Pergunta

Eu tenho usado uma versão do dobro verificado bloqueio em meu aplicativo CF (antes que eu percebesse o que estava bloqueio duplo verificado).

Essencialmente, eu verificar a existência de um objeto. Se ele não estiver presente, eu bloqueio (geralmente usando um bloqueio nomeado) e antes de eu tentar criar o objeto que eu verificar se há existência de novo. Eu pensei que esta era uma maneira pura para parar vários objetos que está sendo criado e parar de bloqueio excessiva no sistema.

Isso parece funcionar, em que não há duplicatas de bloqueio e objeto excessivas não são criados. No entanto, eu aprendi recentemente que dobro verificado Bloqueio trabalho dosn't em Java , o que eu não sei é se isto é verdade em CF, vendo como tópicos CF e bloqueios não são exatamente o mesmo que tópicos e fechaduras nativa Java.

Nenhuma solução correta

Outras dicas

Para adicionar ao que Ben Perdição disse sobre Java, esta é uma prática bastante normal no ColdFusion, especificamente com uma rotina de inicialização do aplicativo onde você configurar suas variáveis ??de aplicativo.

Sem ter pelo menos um bloqueio, você está deixando os ataques iniciais à sua aplicação web todos inicializar as variáveis ??de aplicativo ao mesmo tempo. Isso pressupõe que a sua aplicação é suficiente ocupado para justificar isso. O perigo está lá apenas se o aplicativo está ocupado no momento sua aplicação é ligar pela primeira vez.

O primeiro bloqueio torna-se apenas um pedido por vez inicializa suas variáveis.

O segundo bloqueio, incorporado dentro do primeiro, irá verificar para certificar-se de uma variável definida no final do seu código de inicialização existe, como application.started. Se existir, o usuário é expulso.

O padrão duplo bloqueio salvou minha pele em locais ocupados, no entanto, com os locais muito ocupado, a fila de pedidos de sucesso inicial do aplicativo para completar pode subir muito alto, muito rapidamente, e fazer com que o servidor deixe de funcionar. A idéia é, os pedidos estão esperando o primeiro hit, que é lento, então o segundo uma quebra no primeiro CFLOCK, e é rapidamente rejeitada. Com centenas ou milhares de pedidos na fila, crescendo a cada milissegundo, todos eles são afunilamento para baixo para o primeiro bloco CFLOCK. A solução é definir um tempo limite muito baixo no primeiro CFLOCK e não jogar (ou captura e pato) o erro tempo limite de bloqueio.

Como nota final, este comportamento que eu descrevi foi substituído com ColdFusion 7 de onApplicationStart () método de sua Application.cfc. Se você estiver usando onApplicationStart (), então você não deve ser bloqueio de todo para sua rotina de inicialização do aplicativo. Application.cfc é bem já bloqueado.

Para concluir, sim, verifiquei obras em ColdFusion bloqueio. É útil em algumas determinadas circunstâncias, mas fazê-lo direito. Eu não sei o esquema do por que ela funciona em oposição ao modelo de segmentação de Java, é possível que ele está verificando manualmente algum tipo de tabela de pesquisa no fundo de seu servidor ColdFusion.

Java é threadsafe, por isso não é tanto que seus bloqueios não funcionará como que eles não são necessários. Basicamente, no CF 6+, bloqueios são necessários para prevenir condições de corrida ou criar / althering objetos que existem fora do controle de Java (arquivos, por exemplo).

Para abrir um todo outra lata de vermes ...

Por que você não usar uma biblioteca de injeção de dependência, como Coldspring, para manter o controle de seus objetos e evitar dependências circulares.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top