Com o desenvolvimento vigoroso da Internet, mais e mais empresas da Internet estão enfrentando problemas de segurança simultâneos causados pela expansão do volume do usuário. Este artigo se concentra em vários mecanismos de travamento comuns na simultaneidade de Java.
1. Bloqueio positivo
A trava tendenciosa é um mecanismo de otimização de bloqueio proposto pelo JDK1.6. A idéia principal é que, se o programa não competir, a operação de sincronização de threads que obteve anteriormente o bloqueio será cancelado. Ou seja, se um bloqueio for adquirido por um thread, ele entra no modo de polarização. Quando o encadeamento solicita o bloqueio novamente, não há necessidade de executar operações de sincronização relevantes, economizando tempo de operação. Se outros threads fizerem solicitações de bloqueio intermediárias, o modo de viés de saídas de bloqueio. Usando -xx:+usebiasEdLocking na JVM
pacote jvmProject; importar java.util.list; importar java.util.vector; public class tendenciosa {public static list <preger> numberList = new Vector <preger> (); public static void main (string [] args) {long begin = system.currenttimemillis (); int conting = 0; int startnum = 0; while (contagem <10000000) {numberList.add (startnum); startnum+= 2; contagem ++; } long end = System.currenttimemillis (); System.out.println (End-Begin); }}Inicialize um vetor, adicione 100.000.000 objetos inteiros e, em seguida, produza a diferença de tempo. Isso é usado para testar o desempenho de bloqueios tendenciosos. Quanto ao por que você deve usar o vetor em vez de Arraylist?
Como o ArrayList é inseguro, o vetor é seguro para threads. Isso pode não ser específico o suficiente, você pode olhar para o código -fonte.
Quase todas as operações no vetor são sycronizadas, enquanto a Arraylist não, portanto, o vetor é seguro para threads.
Em seguida, vamos testar quanto impacto a abertura de bloqueios tendenciosos e não a abertura de bloqueios tendenciosos têm no desempenho do programa.
Configure os parâmetros de inicialização da JVM (ligue a trava do viés) para:
Configure os parâmetros de inicialização da JVM (fechamento de preconceito) para:
Perfeito! O tempo de execução do programa que permite o bloqueio tendencioso é significativamente mais curto. Tem certas vantagens para permitir bloqueios tendenciosos do que não permitir bloqueios tendenciosos. O método de sincronização de operar um objeto em um único thread. De fato, também pode ser entendido dessa maneira. Quando houver apenas um encadeamento operando um objeto vetorial com um método de sincronização, a operação no vetor será convertida em uma operação no Arraylist.
A trava tendenciosa não tem um forte efeito de otimização quando a trava é competitiva, porque uma grande quantidade de concorrência fará com que a rosca que mantém a trava alterne continuamente, e é difícil para a fechadura permanecer no modo tendencioso. No momento, o uso da trava tendenciosa não apenas não atinge a otimização de desempenho, mas pode reduzir o desempenho do sistema. Portanto, no caso de concorrência feroz, você pode tentar usá -lo.
-Xx: -UseBiAstedLocking Parâmetro Desativa o bloqueio de viés.
2. Bloqueio leve
Se o bloqueio tendencioso falhar, a máquina virtual Java solicitará ao thread que solicite uma trava leve. O bloqueio leve é implementado dentro da máquina virtual e é implementado usando um objeto que se torna um BasicObjectLock, que é composto por um objeto Basiclock e um ponteiro de objeto Java que segura o bloqueio. O objeto BasicObjectLock é colocado no quadro de pilha Java. O campo Exibir_Header também é mantido dentro do objeto Basiclock, que é usado para fazer backup da palavra Mark do cabeçalho do objeto.
Quando um thread segura a trava de um objeto, o cabeçalho do objeto Mark Word Information é o seguinte
[PTR | 00] bloqueado
Os dois bits no final são 00, e toda a palavra marca é um ponteiro para o objeto Basiclock. Como o objeto BasicObjectlock está na pilha de encadeamentos, o ponteiro deve apontar para o espaço da pilha de encadeamento que segura a trava. Quando é necessário determinar se um encadeamento segura o objeto, é necessário simplesmente determinar se o ponteiro do cabeçalho do objeto está dentro do intervalo de endereço da pilha do encadeamento atual. Ao mesmo tempo, o objeto BASICLOCK Displayed_Header backup do conteúdo da palavra Mark do objeto original e o campo OBJ do objeto BasicObjectlock aponta para a cabeça do objeto que segura o bloqueio.
3. Lock de peso pesado
Quando o bloqueio leve falhar, a máquina virtual usará a trava dos pesos pesados. Ao usar bloqueios de peso pesado, a palavra Mark do objeto é a seguinte:
[PTR | 10] Monitor
Durante a operação, o encadeamento pode ser suspenso no nível do sistema operacional. Nesse caso, o custo de troca e chamadas entre os threads aumentará bastante.
4. Bloqueio de rotação
Uma trava de rotação pode fazer com que a rosca não suspensa quando não obtém a trava, mas mude para executar um loop vazio (ou seja, o chamado spin, o que significa executar o loop vazio). Se o thread puder obter a trava após vários loops vazios, continuará sendo executado. Se o thread ainda não puder obter a fechadura, ela será suspensa.
Após o uso do bloqueio de spin, a chance de o fio ser suspenso é relativamente reduzida e a consistência da execução do encadeamento é relativamente aprimorada. Portanto, tem certos significado positivo para threads simultâneos que não são muito competitivos com bloqueios e têm um tempo muito curto. No entanto, para programas simultâneos que são ferozmente competitivos com bloqueios e bloqueios de thread único ocupam muito tempo, a trava de spin geralmente não pode obter a trava correspondente após a espera de rotação. Isso não apenas perde o tempo da CPU, mas também inevitavelmente a operação suspensa no final, mas também desperdiça os recursos do sistema.
No JDK1.6, a máquina virtual Java fornece o parâmetro -xx:+usepning para ativar a trava de spin e usa o parâmetro -xx: preblockspin para definir o número de vezes que a trava de spin espera.
A partir do JDK 1.7, os parâmetros do bloqueio de spin são cancelados. A máquina virtual não suporta mais o bloqueio de spin configurado pelo usuário. O bloqueio de rotação será sempre executado e o número de bloqueios de spin é ajustado automaticamente pela máquina virtual.